3

我正在尝试以这种方式将 super() 用于简单的类层次结构:

class Employee(object):
    def __init__(self, name):
        self.name = name

class FullTime(Employee):
    def __init__(self, name, satOff, freeDays=[], alDays=[], programDays=[]):
        global satsOffDict
        global dayDict
        super(Employee, self).__init__(name)

但是,我收到此错误:

TypeError: object.__init__() takes no parameters

我读过您需要创建父对象类型对象(新样式类)才能使 super 工作。如果我将 Employee(object) 类更改为 Employee() 类,我会收到以下错误:

TypeError: must be type, not classobj

这是怎么回事?

4

2 回答 2

7

您使用当前super()

super(FullTime, self).__init__(name)

super()查找相对于第一个参数的请求方法;相反,您开始搜索Employee,寻找父类;object.__init__()是在这种情况下匹配的下一个父方法。

需要使用当前类,因为 Python 需要按Method Resolution Order搜索基类;该排序取决于您当前的类是如何从它的基类派生的(特别是如果存在多重继承或基类最终被多次引用)。

在 Python 3.x 上,您可以super()不带任何参数使用,编译器将为您的方法添加额外的提示,以便它可以确定要从哪个正确的类开始。

于 2013-01-09T16:43:24.017 回答
2

当您super在 Python 中使用时,您应该指定派生类型(即,您在其中编写调用的类)作为第一个参数。

super(FullTime, self).__init__(name)
于 2013-01-09T16:43:45.747 回答