dire che ho ottenuto un metaclasse:metaclasse di "__call__" e "__init__" del prodotto di classe
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)
uscita come segue:
Meta: __call__ with (1,)
Domanda:
Perché non è __init__
prodotto ProductClass attivato? Solo a causa di Meta __call__
?
UPDATE:
Ora, aggiungo __new__
per 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)
E 'responsabilità di Meta 's __call__
alla chiamata di __new__
e __init__
ProductClass?
cosa succede se ho ottenuto un "__new__" in ProductClass? "__call__" di Meta chiamerà ProductClass "__new__" e "__init__"? Vedi il mio AGGIORNAMENTO. – Alcott
E a quanto pare, "__call__" di Meta viene chiamato prima di "__new__" di ProductClass. – Alcott
Il problema è che 'Meta .__ call__' è richiesto per chiamare' ProductClass .__ new__' e 'ProductClass .__ init__'. Normalmente, 'type .__ call__' fa questo per te, ma quando definisci' Meta .__ call__' tu _override_ quel comportamento, il che significa che non viene eseguito a meno che tu non lo faccia. Quindi, sei obbligato a chiamare "__new__" e "__init__" da solo, o effettuare una chiamata a qualcosa come "type .__ call __ (cls, * args)'. –