111 votes

Remplacement de la méthode Python, la signature est-elle importante ?

Disons que j'ai

 class Super():
  def method1():
    pass

class Sub(Super):
  def method1(param1, param2, param3):
      stuff

Est-ce correct? Les appels à method1 iront-ils toujours à la sous-classe ? Mon plan est d'avoir 2 sous-classes qui remplacent chacune method1 avec des paramètres différents

48voto

Python le permettra, mais si method1() est destiné à être exécuté à partir de code externe, vous voudrez peut-être reconsidérer cela, car il viole LSP et ne fonctionnera donc pas toujours correctement.

3voto

Zitrax Points 3443

Vous pouvez faire quelque chose comme ceci si vous pouvez utiliser les arguments par défaut :

 >>> class Super():
...   def method1(self):
...     print("Super")
...
>>> class Sub(Super):
...   def method1(self, param1="X"):
...     super(Sub, self).method1()
...     print("Sub" + param1)
...
>>> sup = Super()
>>> sub = Sub()
>>> sup.method1()
Super
>>> sub.method1()
Super
SubX

2voto

BasicWolf Points 8119

En python, toutes les méthodes de classe sont "virtuelles" (en termes de C++). Donc, dans le cas de votre code, si vous souhaitez appeler method1() en super classe, cela doit être :

 class Super():
    def method1(self):
        pass

class Sub(Super):
    def method1(self, param1, param2, param3):
       super(Sub, self).method1() # a proxy object, see http://docs.python.org/library/functions.html#super
       pass

Et la signature de la méthode compte. Vous ne pouvez pas appeler une méthode comme celle-ci :

 sub = Sub()
sub.method1() 

1voto

quasistoic Points 1795

Ça va marcher:

 >>> class Foo(object):
...   def Bar(self):
...     print 'Foo'
...   def Baz(self):
...     self.Bar()
... 
>>> class Foo2(Foo):
...   def Bar(self):
...     print 'Foo2'
... 
>>> foo = Foo()
>>> foo.Baz()
Foo
>>> 
>>> foo2 = Foo2()
>>> foo2.Baz()
Foo2

Cependant, ce n'est généralement pas recommandé. Jetez un œil à la réponse de S.Lott : Les méthodes avec le même nom et des arguments différents sont une odeur de code .

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X