一,元类
元のクラスは、クラスのようなものを作成するために使用されるクラスです
デフォルトでは、すべてのクラスは、タイプ元です
継承された型は、このクラスはメタクラスになっている限り。
カスタムメタクラス:
クラス(タイプの)が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:オブジェクトからプロパティを削除