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