我有兩個類A
和B
,其中B
從A
繼承並覆蓋屬性。 A
不在我的控制之下,所以我無法更改它。在類內部和外部呼叫者之間進行區分
的代碼如下:
class A():
def __init__(self, value):
self.value = value
@property
def value(self):
return self._value
@value.setter
def value(self, value):
self._value = value
class B(A):
def __init__(self, value):
super(B, self).__init__(value)
@property
def value(self):
return super(B, self).value
@value.setter
def value(self, value):
raise AttributeError("can't set attribute")
當我打電話B(1)
我明明得到AttributeError: can't set attribute
。
我想有不同的行爲時value
從內部類的方法
@value.setter
def value(self, value):
if set from inside class hierarchy:
pass
else:
raise AttributeError("can't set attribute")
模塊inspect
似乎並沒有給我足夠的信息來做到這一點,除了對已知函數列表檢查組。
你就不能設置'self._value',而不是'self.value'?屬性作爲外部世界的API存在,不一定在對象本身內。 – acdr
您可以檢查堆棧跟蹤以找出調用者是誰。 – Norman
@acdr,不幸的是'A'不在我的控制之下,所以我不能改變它的行爲方式。我編輯了這個問題來反映這一點。 – Dumitru