property在这种情况下,请勿使用。一个
property对象是一个数据描述符,这意味着任何访问
instance.var将调用该描述符和Python将永远不会寻找在实例本身的属性。
您有两种选择:使用
.__setattr__()挂钩或构建仅实现的描述符
.__set__。
使用.__setattr__()
挂钩
class MyClass(object): var = 'foo' def __setattr__(self, name, value): if name == 'var': print "Setting var!" # do something with `value` here, like you would in a # setter. value = 'Set to ' + value super(MyClass, self).__setattr__(name, value)
现在,在 读取
.var时使用普通的属性查找,但是在调用分配给
.var该
__setattr__方法时会使用
value它,让您根据需要进行拦截和调整。
演示:
>>> mc = MyClass()>>> mc.var'foo'>>> mc.var = 'bar'Setting var!>>> mc.var'Set to bar'
setter描述符
setter描述符将仅拦截变量分配:
class SetterProperty(object): def __init__(self, func, doc=None): self.func = func self.__doc__ = doc if doc is not None else func.__doc__ def __set__(self, obj, value): return self.func(obj, value)class Foo(object): @SetterProperty def var(self, value): print 'Setting var!' self.__dict__['var'] = value
请注意我们需要如何分配给instance
.__dict__属性,以防止再次调用setter。
演示:
>>> f = Foo()>>> f.var = 'spam'Setting var!>>> f.var = 'ham'Setting var!>>> f.var'ham'>>> f.var = 'biggles'Setting var!>>> f.var'biggles'



