覆蓋您必須作用於類,而不是對實例的屬性,因爲他們的機器,在實例,在__dict__
查找之前被調用,並且最終以AttributeError
s結束。相反,你可以在課堂上設置不同的屬性。
但要做到這一點,您必須在每次創建實例時修改您的類(我敢打賭,您不需要),或者您必須動態生成新類。
例如:
class Foo(object):
def __init__(self, val):
self._val = val
@property
def val(self):
return self._val
class SubType(Foo):
def __new__(cls, val):
if val % 2:
#random condition to change the property
subtype = type('SubFoo', (SubType,),
{'val': property((lambda self: self._val + 1))})
return object.__new__(subtype)
else:
return object.__new__(cls)
而且結果是:
>>> d = SubType(3) #property changed
>>> d.val
4
>>> f = SubType(2) #same property as super class
>>> f.val
2
我不太喜歡這樣的黑客。也許這樣做事情的更簡單的方法是調用,計算屬性值的私有方法,例如:
class Foo(object):
def __init__(self, val):
self._val = val
def _compute_val(self):
return self._val
@property
def val(self):
return self._compute_val()
class SubFoo(Foo):
def _compute_val(self):
if self._val % 2:
return self._val + 1
else:
return self._val
其產生相同的結果之前:
>>> d = SubFoo(3)
>>> d.val
4
>>> f = SubFoo(2)
>>> f.val
2
我相信這一招可以看出作爲模板方法設計模式的應用程序,即使它應用於屬性。
你是什麼意思「有屬性方法返回」?你是說你想'my_foo.bar'返回你傳入的空字符串,但是如果你做了'other_foo = Foo(** {'bar':None})'',那麼你希望'other_foo.bar'運行財產? – BrenBarn
您能否請張貼一些示例代碼和預期結果來說明您的問題?根本不清楚你要求什麼。 – nneonneo
我試圖澄清一些。 – MFB