[英]Python super: calling a base class method which contains another base class method that is overriden by derived class
[英]Run Overriden Method Automatically From Base Class
在繼承的情況下,從每個孩子覆蓋的基類中自動運行方法的最佳方法是什么。 在下面,我實現了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'
問題在於,在您調用print_info()
self.employee_code
尚未定義,因為在分配超類之前會調用它的構造函數。 一種可能性是對子類的構造函數重新排序:
class Employee(Person):
def __init__(self, fname, lname, employee_code):
self.employee_code = employee_code
super().__init__(fname, lname)
通常不建議這樣做,因為最佳實踐是先調用超類的構造函數,然后再調用子類的構造函數中的其他任何東西,但是您可以這樣做。
請注意,僅當您在構造函數中使用重寫方法(取決於子類數據)時,才會出現問題,通常可以使用超類代碼中的重寫方法。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.