Python 2.x super __init__ inheritance doesn't work when parent doesn't inherit from object

后端 未结 4 1968
既然无缘
既然无缘 2020-12-14 16:46

I have the following Python 2.7 code:

class Frame:
    def __init__(self, image):
        self.image = image

class Eye(Frame):
    def __init__(self, image)         


        
相关标签:
4条回答
  • 2020-12-14 17:09

    Frame must extend object because only the new style classes support super call you make in Eye like so:

    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()
    
    0 讨论(0)
  • 2020-12-14 17:11

    Please write :__metaclass__ = type at the top of the code then we can Access super class

    __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()
    
    0 讨论(0)
  • 2020-12-14 17:12

    There are two errors here:

    1. super() only works for new-style classes; use object as a base class for Frame to make it use new-style semantics.

    2. You still need to call the overridden method with the right arguments; pass in image to the __init__ call.

    So the correct code would be:

    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()
    
    0 讨论(0)
  • 2020-12-14 17:18

    Hi see my working codes for 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)
    
    0 讨论(0)
提交回复
热议问题