在继承的情况下,从每个孩子都覆盖的基类中自动运行方法的最佳方法是什么。在下面,我实现了print_info以自动从基类Person运行,但是当我初始化子类时,我收到一个错误,因为看来print_info仅从基类而非子类运行。
class Person:
def __init__(self, fname, lname):
self.fname = fname
self.lname = lname
self.print_info()
def print_info(self):
print('{} {}'.format(self.fname, self.lname))
class Employee(Person):
def __init__(self, fname, lname, employee_code):
super().__init__(fname, lname)
self.employee_code = employee_code
def print_info(self):
print('{} {} has employee code {}'.format(self.fname, self.lname, self.employee_code))
e = Employee('Jon', 'Taylor', 'jtaylor')
错误
AttributeError: 'Employee' object has no attribute 'employee_code'
答案 0 :(得分:3)
问题在于,您正在调用print_info()
self.employee_code
时尚未定义,因为在分配超类之前已调用了该超类的构造函数。一种可能性是对子类的构造函数进行重新排序:
class Employee(Person):
def __init__(self, fname, lname, employee_code):
self.employee_code = employee_code
super().__init__(fname, lname)
通常不建议这样做,因为最佳实践是先调用超类的构造函数,再调用子类的构造函数中的其他任何东西,但是您可以可以这样做。
请注意,仅当您在构造函数中使用重写方法(取决于子类数据)时,才会出现问题,通常可以使用超类代码中的重写方法。