覆盖您必须作用于类,而不是对实例的属性,因为他们的机器,在实例,在__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