Наследование Python super __init__
У меня есть следующий код Python 2.7:
class Frame:
def __init__(self, image):
self.image = image
class Eye(Frame):
def __init__(self, image):
super(Eye, self).__init__()
self.some_other_defined_stuff()
Я пытаюсь расширить метод __init__()
, чтобы при создании "Глаза" он создавал кучу других вещей (self.some_other_defined_stuff()), в дополнение к тому, что создает Frame. Frame.__init__()
необходимо выполнить сначала.
Я получаю следующую ошибку:
super(Eye, self).__init__()
TypeError: must be type, not classobj
Который я не понимаю логической причины. Может кто-нибудь объяснить, пожалуйста? Я привык просто набирать "super" в рубине.
Ответы
Ответ 1
Здесь есть две ошибки:
-
super()
работает только для классов нового стиля; используйте object
как базовый класс для Frame
, чтобы использовать семантику нового стиля.
-
Вам все равно нужно вызвать переопределенный метод с правильными аргументами; перейдите в image
к вызову __init__
.
Итак, правильный код:
class Frame(object):
def __init__(self, image):
self.image = image
class Eye(Frame):
def __init__(self, image):
super(Eye, self).__init__(image)
self.some_other_defined_stuff()
Ответ 2
Frame
должен расширять object
, потому что только новые классы стиля поддерживают super
вызов, который вы делаете в Eye
следующим образом:
class Frame(object):
def __init__(self, image):
self.image = image
class Eye(Frame):
def __init__(self, image):
super(Eye, self).__init__(image)
self.some_other_defined_stuff()
Ответ 3
Привет, мои рабочие коды для python 2.7
__metaclass__ = type
class Person:
def __init__(self, first, last, age):
self.firstname = first
self.lastname = last
self.age = age
def __str__(self):
return self.firstname + " " + self.lastname + ", " + str(self.age)
class Employee(Person):
def __init__(self, first, last, age, staffnum):
super(Employee, self).__init__(first, last, age)
self.staffnumber = staffnum
def __str__(self):
return super(Employee, self).__str__() + ", " + self.staffnumber
x = Person("Marge", "Simpson", 36)
y = Employee("Homer", "Simpson", 28, "1007")
print(x)
print(y)