Наследование Python 2.x 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__() метод, так что когда я создаю экземпляр 'Eye', он делает кучу других вещей (self.some_other_defined_stuff()), в дополнение к тому, что устанавливает Frame. Frame.__init__() должен бежать первым.

Я получаю следующую ошибку:

super(Eye, self).__init__()
TypeError: must be type, not classobj

Что я не понимаю, логическая причина. Может кто-нибудь объяснить, пожалуйста? Я привык просто набирать 'super' в ruby.

4 ответа

Решение

Здесь есть две ошибки:

  1. super() работает только для новых классов; использование object в качестве базового класса для Frame чтобы заставить его использовать семантику нового стиля.

  2. Вам все еще нужно вызвать переопределенный метод с правильными аргументами; пройти в 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()

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()

Пожалуйста, напишите:__metaclass__ = type в верхней части кода, то мы можем получить доступ к суперклассу

__metaclass__ = type
class Vehicle:
                def start(self):
                                print("Starting engine")
                def stop(self):
                                print("Stopping engine")                            
class TwoWheeler(Vehicle):
                def say(self):
                    super(TwoWheeler,self).start()
                    print("I have two wheels")
                    super(TwoWheeler,self).stop()                            
Pulsar=TwoWheeler()
Pulsar.say()

Привет увидеть мои рабочие коды для 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)
Другие вопросы по тегам