web-dev-qa-db-fra.com

Qu'est-ce qu'un exemple de base d'héritage unique utilisant le mot clé super () en Python?

Disons que j'ai configuré les classes suivantes:

class Foo:
     def __init__(self, frob, frotz):
          self.frobnicate = frob
          self.frotz = frotz
class Bar:
     def __init__(self, frob, frizzle):
          self.frobnicate = frob
          self.frotz = 34
          self.frazzle = frizzle

Comment puis-je (si je peux) utiliser super () dans ce contexte pour éliminer le code en double?

27
lfaraone

Dans Python> = 3.0, comme ceci:

class Foo():
    def __init__(self, frob, frotz)
        self.frobnicate = frob
        self.frotz = frotz

class Bar(Foo):
    def __init__(self, frob, frizzle)
        super().__init__(frob, 34)
        self.frazzle = frizzle

En savoir plus ici: http://docs.python.org/3.1/library/functions.html#super

EDIT: Comme dit dans une autre réponse, parfois simplement utiliser Foo.__init__(self, frob, 34) peut être la meilleure solution. (Par exemple, lorsque vous travaillez avec certaines formes d'héritage multiple.)

26
JAB

En supposant que vous vouliez que la classe Bar définisse la valeur 34 dans son constructeur, cela fonctionnerait:

class Foo(object):
     def __init__(self, frob, frotz):
          self.frobnicate = frob
          self.frotz = frotz

class Bar(Foo):
     def __init__(self, frob, frizzle):
          super(Bar, self).__init__(frob, frizzle)
          self.frotz = 34
          self.frazzle = frizzle


bar = Bar(1,2)
print "frobnicate:", bar.frobnicate
print "frotz:", bar.frotz
print "frazzle:", bar.frazzle

Cependant, super introduit ses propres complications. Voir par exemple super considéré comme nocif . Par souci d'exhaustivité, voici la version équivalente sans super.

class Foo(object):
     def __init__(self, frob, frotz):
          self.frobnicate = frob
          self.frotz = frotz

class Bar(Foo):
     def __init__(self, frob, frizzle):
          Foo.__init__(self, frob, frizzle)
          self.frotz = 34
          self.frazzle = frizzle


bar = Bar(1,2)
print "frobnicate:", bar.frobnicate
print "frotz:", bar.frotz
print "frazzle:", bar.frazzle
29
ire_and_curses