我正在使用Python类继承并遇到一个问题,如果从子类(下面的代码)调用继承的__init__
,我从Active Python获得的结果是:
>>> start
Tom Sneed
Sue Ann
Traceback (most recent call last):
File "C:\Python26\Lib\site-packages\pythonwin\pywin\framework\scriptutils.py", line 312, <br>in RunScript
exec codeObject in __main__.__dict__
File "C:\temp\classtest.py", line 22, in <module>
print y.get_emp()
File "C:\temp\classtest.py", line 16, in get_emp
return self.FirstName + ' ' + 'abc'
AttributeError: Employee instance has no attribute 'FirstName'
class Person():
AnotherName = 'Sue Ann'
def __init__(self):
self.FirstName = 'Tom'
self.LastName = 'Sneed'
def get_name(self):
return self.FirstName + ' ' + self.LastName
class Employee(Person):
def __init__(self):
self.empnum = 'abc123'
def get_emp(self):
print self.AnotherName
return self.FirstName + ' ' + 'abc'
x = Person()
y = Employee()
print 'start'
print x.get_name()
print y.get_emp()
答案 0 :(得分:25)
三件事:
这看起来像是:
class Person(object):
AnotherName = 'Sue Ann'
def __init__(self):
super(Person, self).__init__()
self.FirstName = 'Tom'
self.LastName = 'Sneed'
def get_name(self):
return self.FirstName + ' ' + self.LastName
class Employee(Person):
def __init__(self):
super(Employee, self).__init__()
self.empnum = 'abc123'
def get_emp(self):
print self.AnotherName
return self.FirstName + ' ' + 'abc'
建议使用super,因为它在多个继承情况下也只能正确处理调用构造函数一次(只要继承图中的每个类也使用super)。如果/当你改变继承的类时,你也需要更改代码的地方少一些(例如,你将基类分解出来并更改派生而不需要担心你的类调用错误的父类构造函数)。同样在MI前端,您只需要一个超级调用来正确调用所有基类构造函数。
答案 1 :(得分:9)
你应该明确地调用超类'init函数:
class Employee(Person):
def __init__(self):
Person.__init__(self)
self.empnum = "abc123"
答案 2 :(得分:5)
员工必须显式调用父级的__init __(不是init):
class Employee(Person):
def __init__(self):
Person.__init__(self)
self.empnum = 'abc123'
答案 3 :(得分:2)
而不是super(class, instance)
模式,为什么不只是使用super(instance)
作为类总是instance.__class__
?
是否存在不属于instance.__class__
的特定情况?