web-dev-qa-db-fra.com

comment se référer à une méthode parente en python?

Supposons que j'ai deux classes (une parent et une sous-classe). Comment est-ce que je fais référence à une méthode de la classe parente si la méthode est également définie dans la sous-classe différente?

Voici le code:

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)

Dans la toute dernière ligne, je veux faire référence à la classe parente A avec la commande "self.f (num)", pas à la méthode elle-même en B qui créerait une récursion infinie. Merci d'avance.

27
user1111042

Si vous savez que vous voulez utiliser A, vous pouvez également vous référer explicitement à A de cette manière: 

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

rappelez-vous que vous devez donner explicitement l'auto-argument à la fonction membre A.f ()

34
jimifiki

Utilisez super :

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

Ou en python 3, c'est juste:

return 7 * super().f(num)
37
tzaman

En ligne avec les autres réponses, il existe plusieurs façons d'appeler des méthodes de super classe (y compris le constructeur), cependant, dans Python-3.x, le processus a été simplifié:

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() est maintenant équivalent à super(<containing classname>, self) selon les docs .

5
Aidan Gomez

Pourquoi ne pas garder les choses simples?

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

Découvrez ma réponse à Appelez la méthode d'une classe parent à partir de la classe enfant en Python? .

C'est une légère torsion sur certains autres ici (qui n'utilisent pas super).

0
BuvinJ

vous pouvez utiliser super ou si vous pouvez être plus explicite et faire quelque chose comme ça.

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