Surcharger une fonction d'une classe parente

Par une fonction d'une classe enfant

L'auteur de ce sujet a trouvé une solution à son problème.
Auteur du sujet

Bonjour,

Je bosse actuellement sur un projet en python 2.7

Grosso modo : J'ai la classe Foo qui hérite de Bar. Dans Bar, j'ai une fonction Action() qui fais une action. Dans Foo, j'ai besoin de Action() écrite dans Bar() avec un petit truc en plus.

Sachant que j'appel Foo.Action(), comment faire les deux actions dont j'ai besoin, sans modifier le Action() qui est dans Foo ?

J'ai fais ça :

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
class Foo():
    def Action(self):
       print "Titi"

#Idée numéro 1 :
class Bar(Foo):
    def Action(self):
        print "Toto"
        Foo.Action()

#Idée numéro 2 :
class Bar(Foo):
    def Action(self):
        print "Toto"
        super(Bar, self).Action()


var = Bar()
var.Action()#Doit afficher "Toto\nTiti"

Erreur de l'idée n°1 : TypeError: unbound method Action() must be called with Foo instance as first argument (got int instance instead)

Erreur de l'idée n°2 : TypeError: must be type, not classobj

J'espère que j'ai correctement expliqué le problème. Cordialement, Kr0stAr

Édité par Krostar

+0 -0
Staff

Salut,

Tu oublies le self en premier argument de tes méthodes :

1
2
3
4
5
6
7
8
class Foo(object):
    def action(self):
       print "Titi"

class Bar(Foo):
    def action(self):
        print "Toto"
        super(Bar, self).action()  # ou bien Foo.action(self)

Édité par nohar

I was a llama before it was cool

+0 -0
Staff

Cette réponse a aidé l'auteur du sujet

Dans ce cas j'aimerais bien que tu m'expliques pourquoi mon code fonctionne et pas le tien. Il y a également le fait que tu n'aies pas instancié ta classe avant d'appeler sa méthode :

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
Python 2.7.6 (default, Mar 22 2014, 22:59:56) 
[GCC 4.8.2] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> class Foo(object):
...     def action(self):
...        print "Titi"
... 
>>> class Bar(Foo):
...     def action(self):
...         print "Toto"
...         super(Bar, self).action()  # ou bien Foo.action(self)
... 
>>> b = Bar()
>>> b.action()
Toto
Titi

Édité par nohar

I was a llama before it was cool

+0 -0
Vous devez être connecté pour pouvoir poster un message.
Connexion

Pas encore inscrit ?

Créez un compte en une minute pour profiter pleinement de toutes les fonctionnalités de Zeste de Savoir. Ici, tout est gratuit et sans publicité.
Créer un compte