variable method may classes python python-2.7 static-methods super

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() :

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) .