我正试图以这种方式将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
发生了什么事?
答案 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)