python動的作成クラスを実装する方法の分析

2748 ワード

この例では、pythonがクラスを動的に作成する方法について説明します.皆さんの参考にしてください.具体的には以下の通りです.
pythonは動的言語として、実行時にクラスを動的に作成する方法(python Creating classes dynamically)です.これはプログラミング時に、クラスを動的に生成し、対応する属性と方法を与えるのに役立つ場合があります.通常、次の2つの方法があります.
  • 1. 条件に従って、ハードコーディングが実現される.
  • 2. type metaclassを用いて実現する.

  • 条件によりハードコーディング
    
    def choose_class(name):
     if name == 'foo':
      class Foo(object):
       pass
      return Foo #      ,     
     else:
      class Bar(object):
       pass
      return Bar
    MyClass = choose_class('foo') 
    print MyClass #      ,     
    print MyClass() #       
    
    

    実行後、結果は次のとおりです.
    <__main__.foo object=""at=""/>
    しかし、実はこれはそんなにダイナミックではありません.プログラムの中でclassの定義を書き終わらせなければなりません.classがオブジェクトである以上、必ず何かから作成することができます.pythonではclassキーを使用するとpythonがこのobjectを自動的に作成します.手動で作成できる方法はtypeメソッドです.これは特殊な方法であり、クラスを作成することができる.typeの構文は次のとおりです.
    
    type(name of the class, 
      tuple of the parent class (for inheritance, can be empty), 
      dictionary containing attributes names and values)
    
    

    この文法規則に従って、次の例を示します.
    
    def echo_msg(self):
     print self.msg
    print '===dynamic create class==='+ '*'*50
    MyClass = type('MyClass',(object,),{"a":123,"b":"summer","msg":"test message","echo_msg":echo_msg})
    print MyClass.a
    myclass = MyClass()
    myclass.echo_msg()
    print myclass.a,myclass.b
    print '===dynamic create subclass==='+ '*'*50
    MySubClass = type('MySubClass',(MyClass,),{"c":"c-value"})
    print MySubClass.c,MySubClass.a,MySubClass.b
    print issubclass(MySubClass, MyClass)
    mysubclass = MySubClass()
    mysubclass.echo_msg()
    
    

    実行結果は次のとおりです.
    ===dynamic create class===************************************************** 123 test message 123 summer ===dynamic create subclass===************************************************** c-value 123 summer True test message
    この例ではtypeを使用してMyClassクラスを作成し、MySubClassを作成してMyClassクラスを継承し、プロパティ、メソッドをバインドします.MySubClassは独自の属性をバインドし、ベースクラスの属性、メソッドを継承します.
    これによりpythonでクラスを動的に作成することができ、主な功労者はtypeメソッドであり、なぜtypeがこんなに強いのか、その最終的な原因はtypeがmetaclass、メタクラスであり、クラスを作成するためのクラスである.たとえば、
    
    Class=MetaClass()
    instance=Class()
    
    

    metaclassとは何か、どのように利用するのか、後述の文章でpython metaclassについて詳しく説明します.
    Pythonに関する詳細については、「Pythonオブジェクト向けプログラム設計入門と進級チュートリアル」、「Pythonデータ構造とアルゴリズムチュートリアル」、「Python関数使用テクニックまとめ」、「Python文字列操作テクニックまとめ」、「Python符号化操作テクニックまとめ」、「Python入門と進級クラシックチュートリアル」などのトピックを参照してください.
    ここではPythonプログラムの設計に役立つことを願っています.