当父级不从对象继承时,Python 2.x 超级 __init__ 继承不起作用

Posted

技术标签:

【中文标题】当父级不从对象继承时,Python 2.x 超级 __init__ 继承不起作用【英文标题】:Python 2.x super __init__ inheritance doesn't work when parent doesn't inherit from object 【发布时间】:2014-05-31 19:32:45 【问题描述】:

我有以下 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”时,除了Frame 设置的内容之外,它还会执行许多其他操作(self.some_other_defined_stuff())。 Frame.__init__() 需要先运行。

我收到以下错误:

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

我不明白其中的逻辑原因。有人可以解释一下吗?我习惯于在 ruby​​ 中输入“super”。

【问题讨论】:

Frame 必须扩展 objectsuper 仅适用于新型类。 【参考方案1】:

请在代码顶部写上:__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()

【讨论】:

【参考方案2】:

您好,请参阅我的 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)

【讨论】:

要改进此答案,请检查您的格式并为您的代码提供解释。【参考方案3】:

Frame 必须扩展 object,因为只有新样式类支持您在 Eye 中进行的 super 调用,如下所示:

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

【讨论】:

【参考方案4】:

这里有两个错误:

    super() 仅适用于new-style classes;使用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()

【讨论】:

在 Python > 3.X 中对object 的引用是否是多余的? @gented: 是的,object 作为基类隐含在 Python 3 中(因为不再有旧式类)。

以上是关于当父级不从对象继承时,Python 2.x 超级 __init__ 继承不起作用的主要内容,如果未能解决你的问题,请参考以下文章

当父可调整大小时,如何防止嵌套DIV的内容溢出父级?

Django 模板扩展:子级不覆盖父级

从 C++ 设置创建的 qml 对象的父级不起作用

不从父级继承的 Spring Cloud 配置云

引导折叠数据父级不起作用

如果父级不调用 wait(),则同一父级的两个子级不使用管道进行通信