は、私がメタクラスだと言う:次のようにメタクラスの "__call__" と製品・クラスの "__init__"
class Meta(type):
def __call__(cls, *args):
print "Meta: __call__ with", args
class ProductClass(object):
__metaclass__ = Meta
def __init__(self, *args):
print "ProductClass: __init__ with", args
p = ProductClass(1)
出力を:
Meta: __call__ with (1,)
質問:
をされていない理由ProductClassの__init__
がトリガーされましたか? Metaの__call__
のためだけですか?
UPDATE:今
、私はProductClassため__new__
を追加します。
class ProductClass(object):
__metaclass__ = Meta
def __new__(cls, *args):
print "ProductClass: __new__ with", args
return super(ProductClass, cls).__new__(cls, *args)
def __init__(self, *args):
print "ProductClass: __init__ with", args
p = ProductClass(1)
はProductClassの__new__
と__init__
を呼び出すためのMetaの__call__
の責任ですか?
ProductClassで "__new__"を取得した場合はどうすればよいですか? Metaの "__call__"はProductClassの "__new__"と "__init__"を呼び出しますか?私のUPDATEを見てください。 – Alcott
そして明らかに、Metaの "__call__"は、ProductClassの "__new__"の前に最初に呼び出されます。 – Alcott
問題は 'ProductClass .__ new__'と' ProductClass .__ init__'を呼び出すために 'Meta .__ call__'が必要であるということです。通常、 'type .__ call__'はこれを行いますが、' Meta .__ call__'を定義するとその動作をオーバーライドします。そうしないと実行されません。したがって、自分で '__new__'と' __init__'を呼び出すか、 'type .__ call__(cls、* args)'のようなものを呼び出す必要があります。 –