簡體   English   中英

從基類自動運行重寫方法

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM