Pythonと反射メタクラス

一,元类

元のクラスは、クラスのようなものを作成するために使用されるクラスです

デフォルトでは、すべてのクラスは、タイプ元です

継承された型は、このクラスはメタクラスになっている限り。

カスタムメタクラス:

クラス(タイプの)がMyType:
     DEF  __init__ (セルフ、clss_name、塩基、辞書):
        スーパー()__init__ (clss_name、塩基、dictの)
         印刷(clss_name、塩基、辞書)
         IF  ないclss_name.istitle():
             昇給の例外(" ああ、あなたは...クラスの名前を書くことはできません" 

#は豚のように、クラスがMyTypeのメタクラスを指定する
クラス豚(=メタクラス:がMyType)を
     パス

クラスダック(=メタクラスがMyTypeを):
     パス

第二に、callメソッドをメタクラス:

あなたは、クラスのオブジェクトが自動的に__call__メタクラスを実行し、クラス自体への最初の引数として呼び出すとします。
メタクラスが呼ぶ覆った後に、このクラスは、オブジェクトを生成することができなくなり、オブジェクトが(スーパーで達成するために作成する必要があります).__ call__、だけでなく、戻り値

使用シナリオ:

あなたがオブジェクトを作成するプロセスを制御したい場合は、callメソッドをカバーします。

あなたは、プロセス制御クラスを作成したい場合は、initメソッドをカバーします。

4:大文字にすべての属性名の目的を達成するために、

小娘がMyType(タイプ):
     デフ __call__(自己、* argsを、** kwargsから):
        new_args = []
         のため引数:
            new_args.append(a.upper())

        プリント(new_args)
         プリント(kwargsから)
         リターン・スーパー() 。__call__(* new_args、** kwargsから)


クラスの人(メタクラス= がMyType):
     デフ __init__ (自己、名前、性別):
        self.name = 名前
        self.gender = ジェンダー

P =人(名前= "ジャック"性別= " " プリント(p.name)
 プリント(p.gender)

2.new方法

あなたはクラスオブジェクトを作成する場合は、この方法は、第1 __new__の元のクラスを実行すると、空のオブジェクトを取得した後、自動的に__init__を呼び出しますされます

初期化方法。

あなたは、このメソッドをオーバーライドし、その新しい方法は、戻り値を持たなければならない、と戻り値がクラスオブジェクトでなければならない場合

クラス(タイプの)メタ:

    DEF  __new__(CLS、* argsを、** kwargsから):
         印刷(CLS) メタクラス独自の
        印刷(引数)いくつかのクラスのクラス名のために必要なパラメータ、基本クラスを作成し、名前空間
        印刷(kwargsからの)空の
        印刷" 新新RUN " #のリターンスーパー().__新しい新しい__(CLS、* argsを、** kwargsから) 
        OBJ =タイプの。__new__(CLS、* argsを、** kwargsから)
         返し、OBJ
     DEF  __init__ (セルフ、 、B、C):
        スーパー()__init__ (A、B、C)
         印刷" 初期化ラン" クラス A(メタクラス= メタ):
     パス
プリント(A)

例3シングル:

クラスオブジェクトを参照し生産することです

リソースを節約するためにシングルトン、クラスのすべてのオブジェクトのプロパティがすべて同じ、複数のオブジェクトを作成する必要はありません

元クラスの実装:

例#n型単
クラスシングル(タイプ):
__callの__ DEF(セルフ、引数*、** kwargsから):
はhasattr( "OBJ"自己、)IF:#は、いくつかの目標があったか否かを判断し
、リターンGETATTR(自己、「OBJ 「)#を返しました

OBJ =スーパー().__コール__ (* argsを、** kwargsから)#は作成されません
( "アップ新")の印刷を
self.obj OBJ =#およびクラスに保存されている
リターン・OBJ


クラスの学生(メタクラス=シングル):
デフ__init __(自己、名):
self.name =名前


Personクラス(メタクラス=シングル):
パス

#は、オブジェクトが作成されます
パーソン()
)(人を

 

 

 

第三に、反射

反射手段は、対象物を検出することができる必要があり、変更、属性の能力を高める必要があります

実際には、文字列操作のプロパティで反射しました

1.hasattr:オブジェクトのプロパティが存在するかどうかを決定します

2.getattr:オブジェクトからプロパティを削除します

3.setattr:オブジェクトにプロパティを追加

4.delattr:オブジェクトからプロパティを削除

 

おすすめ

転載: www.cnblogs.com/wujc3/p/11272430.html