Dicen que tengo una metaclase:MetaClass de "__call__" y "__init__" del producto de clase
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)
de salida de la siguiente manera:
Meta: __call__ with (1,)
Pregunta:
¿Por qué no es ¿Se activó __init__
de ProductClass? ¿Solo por el __call__
de Meta?
ACTUALIZACIÓN:
Ahora, agrego __new__
para 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)
Es responsabilidad __call__
's de Meta a la llamada de __new__
y __init__
ProductClass?
lo que si me dieron una "__new__" en ProductClass? ¿El "__call__" de Will Meta llama a "__new__" y "__init__" de ProductClass? Ver mi ACTUALIZACIÓN. – Alcott
Y aparentemente, se llama primero a "__call__" de Meta antes de "__new__" de ProductClass. – Alcott
El problema es que 'Meta .__ call__' es necesario para llamar a' ProductClass .__ new__' y 'ProductClass .__ init__'. Normalmente, 'type .__ call__' hace esto por usted, pero cuando define' Meta .__ call__' usted _override_ ese comportamiento, lo que significa que no se ejecuta a menos que lo haga. Entonces, se requiere que usted llame '' __new__' y '__init__' usted mismo, o haga una llamada a algo como' escriba .__ call __ (cls, * args) '. –