簡體   English   中英

在父 class 中實現繼承方法

[英]Implementing inherited method in parent class

我試圖了解 Python 繼承及以下 class CarWithBrakes繼承自 class Car

class Car :
    def __init__(self , wheels):
        self.wheels = wheels
        self.jsonTransform = {}
        self.jsonTransform['wheels'] = wheels
        
    def toJson(self):
        return self.jsonTransform
    
    def get_wheels(self):
        return self.wheels
    
class CarWithBrakes(Car):
    
    def __init__(self , car, brakes):
        self.car = car
        self.brakes = brakes

    def toJson(self):
        self.jsonTransform = {}
        self.jsonTransform['wheels'] = self.car.wheels
        self.jsonTransform['brakes'] = self.brakes
        return self.jsonTransform
    
c = Car("wheels")
print(c.toJson())

b = CarWithBrakes(c , "brakes")
print(b.toJson())
print(b.get_wheels())

運行此代碼會產生:

{'wheels': 'wheels'}
{'wheels': 'wheels', 'brakes': 'brakes'}

---------------------------------------------------------------------------
AttributeError                            Traceback (most recent call last)
<ipython-input-62-9b4b5598414b> in <module>
     30 b = CarWithBrakes(c , "brakes")
     31 print(b.toJson())
---> 32 print(b.get_wheels())

<ipython-input-62-9b4b5598414b> in get_wheels(self)
     11 
     12     def get_wheels(self):
---> 13         return self.wheels
     14 
     15 class CarWithBrakes(Car):

CarWithBrakes繼承自Car時,wheel 屬性不應該可用嗎?

這里有兩個問題。

CarWithBrakes確實覆蓋了Car__init__方法。 在重寫方法中,未設置wheels屬性。 通常,您通過super().__init__(...)將要與子 class 共享的工作(例如設置wheels屬性)委托給子 class 初始化程序。

其次,您不必要地混合了 inheritance 和聚合。 CarWithBrakes是 inheritance 的汽車,沒有理由在CarWithBrakes.__init__中傳遞Car實例。

在 Python 中,如果您希望為派生類型執行基本構造函數,則必須調用它。 您可以使用super()來執行此操作,它允許您訪問基本類型。

所以你的CarWithBrakes應該是這樣的:

class CarWithBrakes(Car):
    def __init__(self, wheels, brakes):
        # call base implementation
        super().__init__(wheels)        

        # no need to set `self.wheels` since that is done in the base
        # but do set the `brakes` which the base class does not know about
        self.brakes = brakes

您也不想傳入car實例,而是直接創建CarWithBrakes CarWithBrakes汽車; 但 CarWithBrakes 不包含另一輛車。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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