class MyMeta(type):
def __init__(cls,name,bases,dic) :
print cls. __name__
print name
def __str__(cls):return '美しいクラス %s'%cls.__name__
これは何ですか?ああ、これはメタクラスですね。クラステンプレートです。
どこで使用されますか?これは、このクラスのテンプレートとしてクラスで使用する必要があります。
はどのような役割を果たしますか?テンプレートはいくつかの共通の機能を提供します。
このクラスはどのような機能を提供しますか? 2つの特徴、1.クラスが定義された後、クラスの名前 (__init__) を出力します。 2.印刷クラスの形式 (__str__)。
どのように動作するのでしょうか? インタプリタを開き、上記のコードを入力して開始します:
入力:
class MyClass(object):
__metaclass__ = MyMeta
Enter キーを押してクラス定義を終了すると、出力は次のようになります:
MyClass
MyClass
わかりました、ほほう!初期化するのはオブジェクトではなくクラスであることがわかりました。 ! ! ! !これが最初の特徴です。
2 番目:
入力:
print MyClass
出力:
美しいクラス MyClass
ああ、その通りです。 、予想通りでした! ! ! ! ! ! ! !もちろん、クラスを好きなようにカスタマイズすることもできます。 !
########################################### # #####################################
シングルトン パターンの下に実装してみましょう(Woodpecker コミュニティから):
シングルトン メタクラス:
コードをコピー コードは次のとおりです:
class Singleton(type):
def __init__(cls,name,bases,dic):
super(Singleton,cls).__init__(name,bases,dic)
cls.instance = なし
def __call__(cls,*args,**kwargs):
cls.instance が None の場合:
cls.instance = super(Singleton,cls).__call__(*args,**kwargs)
return cls.instance
非常にシンプルなデザインパターンなので、何が起こっているのか理解できると思います。
コードをコピーします コードは次のとおりです:
class MyClass(object):
__metaclass__ = Singleton
def __init__( self,arg):
self.arg = arg
Singleton メタクラスを使用するクラス。
インスタンスは 1 つだけですか? ?私たちはそれを見ることしかできません。鄧小僧はこう言いました。「実践こそが真実を試す唯一の基準だ」。 - エッセンス! !
コードをコピー コードは次のとおりです:
>>> my1 = MyClass("hello")
>>> my2 = MyClass("world")
>>> my1 は my2
True
>>> my1.arg
>>> my2.arg
'hello'
my2 を作成しようとして失敗しましたが、これは成功したことを証明しています。
実際、メタクラスはあまり使われないので理解しておきましょう。ほほー! !