Подтвердить что ты не робот

Что является основным примером одиночного наследования с использованием ключевого слова super() в Python?

Скажем, у меня установлены следующие классы:

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

Как я могу (если вообще могу) использовать super() в этом контексте для устранения дубликата кода?

4b9b3361

Ответ 1

В Python >= 3.0, например:

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

Подробнее здесь: http://docs.python.org/3.1/library/functions.html#super

EDIT: Как сказано в другом ответе, иногда просто использование Foo.__init__(self, frob, 34) может быть лучшим решением. (Например, при работе с определенными формами множественного наследования.)

Ответ 2

Предполагая, что класс Bar должен установить значение 34 в его конструкторе, это будет работать:

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

Однако super вводит свои собственные осложнения. См. супер считается вредным. Для полноты здесь эквивалентная версия без 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