我想從包含屬性x
的類繼承,然後通過重寫setter將此屬性設置爲子類中的只讀屬性。如果父類中的__init__
使用原始設置器,則這不起作用。考慮下面的代碼。Python:重寫屬性時發生意外的行爲
class Parent:
def __init__(self, x=1):
# I want the following line to use the setter defined in the Parent
# class, even when __init__ is called from Child using super.
self.x = x
# Other initialization of Parent goes here.
@property
def x(self):
return self._x
@x.setter
def x(self, value):
"""Check that x is non-negative."""
if value < 0:
raise ValueError("x must be non-negative.")
self._x = value
class Child(Parent):
def __init__(self):
super().__init__() # Need this for initialization.
@property
def y(self):
return self._y
@y.setter
def y(self, value):
"""x can only be written to implicitly by setting y."""
self._y = value
self._x = abs(value)
@property
def x(self):
return self._x
@x.setter
def x(self, value):
raise AttributeError("Illegal access to x")
如果我現在嘗試實例Child
,我得到AttributeError: Illegal access to x
,因爲當行self.x = x
叫的Child
的x
二傳手被調用,而不是x
二傳手Parent
。我怎樣才能以Python方式使用Parent
的setter?
需要明確的是,當self.x = ...
出現在Parent
的方法,它應該總是利用x
二傳手在Parent
,當self.x = ...
出現在Child
的方法,它應該總是利用x
二傳手在Child
,從而引發異常。
你不能繼承這樣的屬性,你可以這樣做:'Child.x = Parent.x.setter(Parent.x.fset)'類初始化後。 –
@AshwiniChaudhary這是行不通的。它不會爲'Child'使'x'只讀。 –