在类中使用super()

use*_*661 3 python oop

我试图以这种方式使用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)
Run Code Online (Sandbox Code Playgroud)

但是,我收到此错误:

TypeError: object.__init__() takes no parameters
Run Code Online (Sandbox Code Playgroud)

我已经读过你需要创建父对象类型对象(新样式类)才能让super工作.如果我将类Employee(对象)更改为类Employee(),我会收到此错误:

TypeError: must be type, not classobj
Run Code Online (Sandbox Code Playgroud)

这是怎么回事?

Mar*_*ers 7

您使用当前super():

super(FullTime, self).__init__(name)
Run Code Online (Sandbox Code Playgroud)

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

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

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