variable method may decoradores python class-method

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.