そして、メタクラスを反映

反射

反射の意味の、実際には、内省、自己検査とは何ですか

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

これは、文字列操作のプロパティで反射され、

、これらの4つの機能を関与の4つの機能が、二重下線なしの共通の組み込み関数なので、上のプリントとの間に違いはありません

クラスパーソン:
     DEF  __init__ (セルフ、名前、年齢、性別):
        self.name = 名前
        self.age = 年齢
        self.gender = ジェンダー


P(=人' CLY '。、17、' 女性' 

を印刷(はhasattr(P、給料))  を決定するオブジェクト属性があるか否かを
印刷(GETATTR(P、のAGEの、なし))  オブジェクト属性から削除は、デフォルト値が返された場合、ビットの第三の属性値は、デフォルト値を提示していない

オブジェクトにプロパティを追加 
SETATTR(P、' 給与'、1000000000 

#は、オブジェクトのプロパティを削除する 
(P-、delattr ' 給与'

使用シナリオ:

プロパティの追加や削除、検索を変更するという事実を反映しますが、ビルトインの直接使用の場合のdictを理解することは困難で動作する、文法面倒、

もう一つの大きな問題は、オブジェクトが自分自身の書き込みが他の当事者によって提供されていない場合、私は必要がある場合、私は、つまり、オブジェクトが要件を満たすためにあるかどうかを判断するためのプロパティとメソッドを持っているだろうということです

メタクラスメタクラス

すべてのクラスはオブジェクトであります

すべてのクラスはメタクラスを生成しています

オブジェクトは、ルートクラスであるすべてのクラスの親であります

デフォルトでは、すべてのクラスがメタクラスです

 

目的の元クラスの学習:

高度にカスタマイズされたクラスは、クラス名は、例えば、制御は、大きなこぶのように書き込まれなければなりません

クラスはまた、オブジェクトである、独自のクラスを持っています

私たちの需要は、クラスオブジェクトを作成し、いくつかの制限を行うことです

我々は需要を達成することができますinitメソッドをカバーするクラスオブジェクトのクラス(クラスの元を)見つけることができます

もちろん、私たちは、ソースコードを変更することはできませんので、initは完了する必要がカバーしながら、それは、独自のクラスを書くためのタイプを継承する必要があります

継承型メタクラス
#は、クラス定義
、クラスA(タイプ):
     DEF  __init__ (セルフ、CLASS_NAME、塩基、辞書):
        スーパー()__init__ (CLASS_NAME、塩基、辞書)
        self.name = CLASS_NAME
         IF  ないself.name .istitle():
             昇給の例外
 #は、ASDメタクラスはクラスに割り当てられている
クラス ASD(=メタクラスこと:a)の
     パス

コールメタクラス

あなたが呼び出すと、クラスオブジェクトは、自動的に__call__メソッドの元クラスを大切にし、クラス自体への最初の引数だけでなく、後ろのパラメータの束として

メタクラスが呼ぶ覆った後、このクラスが生成することができませんオブジェクト、あなたが。)(スーパーを呼び出す必要があり、オブジェクトの作成を完了するために__call__   
とその戻り値を返します。

利用シナリオ

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

あなたは、プロセスコントロールクラスを作成したいときは、initメソッドをカバー

ケース:

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

クラスMYTYPE(タイプ):
     デフ __call__(自己、* argsを、** kwargsから):
        L = []
         のための引数:
            l.append(i.upper())
        戻りスーパー()。__call__(L *、** kwargsから)


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

P =人(' CLY '' ' 印刷(P。__dict__

注意:カバー呼び出しはメタクラスオブジェクトを生成するためにcallメソッドを呼び出してオブジェクトを返す必要がありたら

 

新しい方法を補足

あなたがオブジェクトを作成したい場合は、この方法は、空のオブジェクトを取得し、最初の__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)

ビューのコントロールクラスポイントを作成する実装工程において、initメソッド、またはinitメソッドと比較して新しい方法が比較的簡単です

シングルトンデザインパターン

シングルトン:オブジェクトを生成するクラスを参照
なぜ使用シングルトン?
シングルトンすべて同じクラスのすべてのオブジェクトのプロパティは、複数のオブジェクトを作成する必要はありませんリソースを節約するため、中

元クラスの実装:

クラスMYTYPE(タイプ):

    DEF  __call__(セルフ、引数*、** kwargsから):
         IFはhasattr(セルフは、' OBJ '):  、オブジェクトがオブジェクトが存在するかどうかを判断する
            リターン(、自己GETATTR ' OBJ ' 
        OBJスーパーを=() 。__call__(* argsを、** kwargsから)   どのオブジェクトも作成しません 
        self.objをOBJ =   クラスに
        戻りOBJの


クラスの人(=メタクラスMYTYPEを):

    DEF  __init__ (セルフ、名前、年齢):
        self.name = 名前
        self.age =年齢

P =人(' CLY '、18である
P1 =人物(' ASD '' ASD ' #は、一つだけのオブジェクトが存在するであろう
プリント(P1。__dict__

 

おすすめ

転載: www.cnblogs.com/asdaa/p/11273213.html