說我有一個元類:元類的 「__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:
現在,我想補充__new__
爲ProductClass:
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)
它是多彩的__call__
的責任,呼籲ProductClass的__new__
和__init__
?
什麼,如果我得到了一個ProductClass「__new__」? Meta的「__call__」調用ProductClass的「__new__」和「__init__」?看我的更新。 – Alcott
顯然,Meta的「__call__」在ProductClass的「__new__」之前被首先調用。 – Alcott
問題是,需要'Meta .__ call__'來調用'ProductClass .__ new__'和'ProductClass .__ init__'。通常,'type .__ call__'是爲你做的,但是當你定義'Meta .__ call__'時,你會覆蓋這個行爲,這意味着除非你這麼做,否則它不會被執行。所以,你需要自己調用'__new__'和'__init__',或者調用類似'.__ call __(cls,* args)'的東西。 –