我正在使用 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()
三件事:
这看起来像:
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 方面,您只需要一次超级调用即可正确调用所有基类构造函数。
您应该显式调用超类的 init 函数:
class Employee(Person):
def __init__(self):
Person.__init__(self)
self.empnum = "abc123"
员工必须显式调用父级的 __init__ (而不是 init):
class Employee(Person):
def __init__(self):
Person.__init__(self)
self.empnum = 'abc123'
而不是
super(class, instance)
模式为什么不直接使用 super(instance)
因为类总是 instance.__class__
?
有没有具体情况不会
instance.__class__
?
在子类的__init__
方法中使用super().
init()调用父类的构造函数,确保继承属性的正确初始化并避免代码冗余。
class Employee(Person):
def __init__(self):
self.empnum = 'abc123'
super().__init__()