Python 从基类自动运行重写的方法

Python 从基类自动运行重写的方法,python,Python,在继承的情况下,从每个子级重写的基类中自动运行方法的最佳方式是什么。下面我实现了print_info从基类Person自动运行,但是当我初始化一个子类时,我得到了一个错误,因为print_info似乎只是从基类而不是子类运行 class Person: def __init__(self, fname, lname): self.fname = fname self.lname = lname self.print_info()

在继承的情况下,从每个子级重写的基类中自动运行方法的最佳方式是什么。下面我实现了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')
错误


问题是,在调用
print\u info()
self.employee\u code
的点尚未定义,因为超类的构造函数在赋值之前已被调用。一种可能是对子类的构造函数重新排序:

class Employee(Person):
    def __init__(self, fname, lname, employee_code):
        self.employee_code = employee_code
        super().__init__(fname, lname)
通常不建议这样做,因为最佳实践是在子类的构造函数中调用任何其他内容之前调用超类的构造函数,但您可以这样做


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

我要补充的是,在这种特殊情况下,可以通过不从类构造函数调用方法来避免错误——初始化类的实例,然后调用它的
print\u info
方法,或者更好的是为类定义
\u str\uu
方法。(这种情况似乎是一种调试方法,因此这不一定是可归纳的建议,因为您有时可能需要从构造函数调用方法/函数)
class Employee(Person):
    def __init__(self, fname, lname, employee_code):
        self.employee_code = employee_code
        super().__init__(fname, lname)