在类中使用super()

时间:2013-01-09 16:42:05

标签: 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)

但是,我收到了这个错误:

TypeError: object.__init__() takes no parameters

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

TypeError: must be type, not classobj

发生了什么事?

2 个答案:

答案 0 :(得分:7)

您使用super()中的当前类:

super(FullTime, self).__init__(name)

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

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

在Python 3.x上,您可以使用不带任何参数的super()compiler will add an extra hint to your method,以便它可以确定要从中开始的正确类。

答案 1 :(得分:2)

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

super(FullTime, self).__init__(name)