2012-02-19 10 views
22

Supongamos que tengo dos clases (una para padres y otra para una subclase). ¿Cómo me refiero a un método en la clase padre si el método también se define en la subclase diferente?cómo hacer referencia a un método principal en python?

Aquí está el código:

class A: 
    def __init__(self, num): 
     self.value=num 
    def f(self, num): 
     return self.value+2 
class B(A): 
    def f(self, num): 
     return 7*self.f(num) 

En la última línea, quiero hacer referencia a la clase padre A con el "self.f (num)" de comandos, no el propio método en el que B crearía una recursión infinita. Gracias de antemano.

Respuesta

28

Si sabe que desea utilizar una también se puede hacer referencia explícita a A de esta manera :

class B(A): 
    def f(self,num): 
     return 7 * A.f(self,num) 

Recuerde que debe dar explícitamente el auto argumento a la función miembro A.f()

+0

Tuve un error al hacer eso, cuando traté de llamar a un método, que se implementó en C. Esperaba una instancia de A como primer parámetro y no reconocía B como una clase secundaria. Supongo que usar super() podría evitar eso, pero aún no estoy seguro. – erikbwork

35

Uso super:

return 7 * super(B, self).f(num) 

O en Python 3, es simplemente:

return 7 * super().f(num) 
+0

esto es teóricamente correcto, pero por alguna razón, me sale: TypeError: super() argumento 1 debe ser tipo, no classobj – user1111042

+6

@ user1111042: Déjame adivinar: ¿estás usando Python 2.x? Entonces tu _clase A_ debería heredar de _objeto_, solo entonces obtendrás una nueva clase de estilo. Las nuevas clases de estilo son instancias de la clase _type_, mientras que las clases de estilo antiguo son solo instancias de _classobj_. _super() _ solo funciona en nuevas clases de estilo. – pillmuncher

+0

Sí, estoy usando Python 2.xy súper como dijiste que no funciona en 2.x – user1111042

1
class B(A): 
    def f(self, num): 
     return 7 * super(B, self).f(num) 
1

¿Por qué no mantenerlo simple?

class B(A): 
    def f(self, num): 
     return 7 * A.f(self, num) 
0

puede utilizar super o si puede ser más explícito y hacer algo como esto.

class B(A): 
    def f(self, num): 
    return 7 * A.f(self, num) 
5

En línea con las otras respuestas, hay múltiples formas de llamar a métodos de clase super (incluyendo el constructor), sin embargo en Python-3.x el proceso se ha simplificado:

Python-2 .x

class A(object): 
def __init__(self): 
    print "world" 

class B(A): 
def __init__(self): 
    print "hello" 
    super(B, self).__init__() 

Python-3.x

class A(object): 
def __init__(self): 
    print "world" 

class B(A): 
def __init__(self): 
    print "hello" 
    super().__init__() 

super() es ahora equivalente a super(<containing classname>, self) según the docs.

Cuestiones relacionadas