从基类自动运行重写方法

时间:2018-09-11 13:49:36

标签: python

在继承的情况下,从每个孩子都覆盖的基类中自动运行方法的最佳方法是什么。在下面,我实现了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'

1 个答案:

答案 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)

通常不建议这样做,因为最佳实践是先调用超类的构造函数,再调用子类的构造函数中的其他任何东西,但是您可以可以这样做。

请注意,仅当您在构造函数中使用重写方法(取决于子类数据)时,才会出现问题,通常可以使用超类代码中的重写方法。