2011-05-25 14 views
8

¿Es este un uso legal de super()?Uso de super() con el padre no inmediato

class A(object): 
    def method(self, arg): 
     pass 

class B(A): 
    def method(self, arg): 
     super(B,self).method(arg) 

class C(B): 
    def method(self, arg): 
     super(B,self).method(arg) 

Gracias.

+1

Parece válido para mí. También querrás leer esto: http://stackoverflow.com/questions/576169/understanding-python-super – blueberryfields

Respuesta

7

Funcionará, pero probablemente confundirá a cualquiera que intente leer su código (incluyéndolo a usted, a menos que lo recuerde específicamente). No olvide que si desea llamar a un método de una clase padre en particular, sólo se puede hacer:

A.method(self, arg) 
+0

Supongo que, si no hay una herencia múltiple involucrada, ambos 'A.method (self, arg)' y 'super (B, self) .method (arg)' son equivalentes (menos la confusión del usuario potencial)? – upperBound

+0

@upperBound: Sí. Aunque, obviamente, en ambos casos, debe ser consciente de lo que sucede si cambia sus relaciones de herencia. –

2

Bueno, "legal" es un término cuestionable aquí. El código terminará llamando al A.method, ya que el tipo dado a super se excluye de la búsqueda. Consideraría que este uso de super es escamoso, por decir lo menos, ya que omitirá un miembro de la jerarquía de herencia (aparentemente haphhazardly), lo cual es inconsistente con lo que esperaría como desarrollador. Como a los usuarios de super ya se les recomienda mantener la coherencia, recomendaría no hacerlo.

+0

Estoy de acuerdo. ¿Qué piensas acerca de usar 'A.method (self, arg)' ya que esto también pasaría por encima de la jerarquía? – upperBound