method - static class python
interacción super() y @staticmethod (2)
Cuando llama a un método normal en una instancia de objeto, el método recibe la instancia de objeto como primer parámetro. Puede obtener la clase de objeto hte y su clase padre, por lo que tiene sentido llamar a super
.
Cuando llama a un método classmethod en una instancia de objeto o en una clase, el método recibe la clase como primer parámetro. Puede obtener la clase principal, por lo que tiene sentido llamar a super
.
Pero cuando llama a un método de método estático, el método no recibe nada, y no tiene forma de saber a partir de qué objeto o clase se llamó. Esa es la razón por la que no puedes acceder a super
en un método estático.
¿Super () no está destinado a ser utilizado con métodos estáticos?
Cuando intento algo como
class First(object):
@staticmethod
def getlist():
return [''first'']
class Second(First):
@staticmethod
def getlist():
l = super(Second).getlist()
l.append(''second'')
return l
a = Second.getlist()
print a
Obtuve el siguiente error
Traceback (most recent call last):
File "asdf.py", line 13, in <module>
a = Second.getlist()
File "asdf.py", line 9, in getlist
l = super(Second).getlist()
AttributeError: ''super'' object has no attribute ''getlist''
Si cambio los métodos estáticos a classmethods y paso la instancia de clase a super (), las cosas funcionan bien. ¿Estoy llamando super (tipo) incorrectamente aquí o hay algo que me falta?
La respuesta corta a
¿Estoy llamando super (tipo) incorrectamente aquí o hay algo que me falta?
es: sí, lo estás llamando incorrectamente ... Y (de hecho, porque ) hay algo que te estás perdiendo.
Pero no te sientas mal; este es un tema extremadamente difícil.
La documentation señala que
Si se omite el segundo argumento, el súper objeto devuelto no está vinculado.
El caso de uso para super
objetos no super
es extremadamente estrecho y raro. Vea estos artículos de Michele Simionato para su discusión sobre super()
:
- Cosas que debe saber sobre Python Super [1 de 3]
- Lo que debe saber sobre Python Super [2 de 3] (este cubre específicamente el super ilimitado)
- Lo que debe saber sobre Python Super [3 de 3]
Además, argumenta enérgicamente para eliminar super
unbound de Python 3 here .
Dije que lo llamabas "incorrectamente" (aunque la corrección no tiene ningún sentido sin contexto, y un ejemplo de juguete no da mucho contexto). Debido a que el super
libre es tan raro, y posiblemente simplemente no tiene justificación, como argumenta Simionato, la forma "correcta" de usar super()
es proporcionar el segundo argumento.
En su caso, la forma más sencilla de hacer que su ejemplo funcione es
class First(object):
@staticmethod
def getlist():
return [''first'']
class Second(First):
@staticmethod
def getlist():
l = super(Second, Second).getlist() # note the 2nd argument
l.append(''second'')
return l
a = Second.getlist()
print a
Si crees que se ve gracioso de esa manera, no estás equivocado. Pero creo que lo que la mayoría de la gente espera cuando ve super(X)
(o espera cuando lo intenta en su propio código) es lo que Python le da si lo hace super(X, X)
.