1
我想寫一個Python的property
的子類,它已經有一個setter,它在設置之前對值進行了特定檢查。Python:編寫一個具有特殊設置行爲的「property」的子類
背景:我有一個有很多屬性的類,它們都不能是負面的。所以我想把它們全部轉換成屬性,並檢查它們是否設置了非負值。但我不想多次寫同一個setter。
請看看下面的例子:
class Body(object):
_mass = 0.
_size = 0.
@nonnegative
def mass(self):
return self._mass
@nonnegative
def size(self):
return self._size
現在我想界定「非負」,這應該從「屬性」繼承。我擬設被覆蓋__set__
的方法,但我堅持:
class nonnegative(property):
def __set__(self, obj, value):
if value < 0:
raise ValueError, 'value must not be negative'
### then set the attribute to value, but how?
### how can I know the name of the attribute?
或者,也許我應該覆蓋fset
?或setter
?有人可以幫忙嗎?
除了縮進問題外,這似乎並不符合OP的要求。首先,你必須執行'body.mass()'而不是'body.mass',所以它不是一個屬性。你必須做'body._mass = 3'而不是'body.mass = 3'。 (如果那不是真的,你根本不需要「最後一招」技巧。) – abarnert 2013-02-27 23:25:37
@abarnert:關於財產的真實性,這是我問的方式:「不是這樣簡單」! – cox 2013-02-27 23:51:35
你認爲一個你必須用'body.mass()'獲取值並用'body._mass'設置它的API是_simpler_而不是你得到和設置一致的API? – abarnert 2013-02-28 00:15:53