python - method - super y__nueva__ confusión
python static variable (1)
Como lo que acabo de aprender, puedo usar super()
esta manera:
super(class, obj_of_class-or-_subclass_of_class)
El código va abajo:
#Case 1
class A(object):
def __init__(self):
print "A init"
class B(A):
def __init__(self):
print "B init"
super(B, self).__init__() #ok, I can invoke A''s __init__ successfully
#Case 2
class A(object):
@classmethod
def foo(cls):
print "A foo"
class B(object):
@classmethod
def foo(cls):
print "B foo"
super(B, cls).foo() #ok, I can invoke A''s foo successfully
#Case 3
class A(object):
def __new__(cls):
print "A new"
return super(A, cls).__new__(cls)
class B(A):
def __new__(cls):
print "B new"
return super(B, cls).__new__() #Oops, error
PREGUNTA:
En el caso 1 y 2, puedo usar super exitosamente sin especificar los obj
o cls
para operar. Pero ¿por qué no puedo hacer lo mismo para __new__
? Porque, en el caso 3, si uso super de esa manera, recibí un error. Pero si lo uso de esta manera:
super(B, cls).__new__(cls)
No hay error.
De las notas de la versión de Python sobre la anulación del método __new__
:
__new__
es un método estático , no un método de clase. Inicialmente pensé que tendría que ser un método de clase, y es por eso que agregué el método de clase primitivo. Desafortunadamente, con los métodos de clase, las llamadas ascendentes no funcionan bien en este caso, así que tuve que convertirlo en un método estático con una clase explícita como primer argumento.
Como __new__
es un método estático, super(...).__new__
devuelve un método estático. No hay vinculación de cls
al primer argumento en este caso. Todos los argumentos deben ser proporcionados explícitamente.