您不能直接将属性用作发布代码的修饰器,因为它不是设计用于这种方式的,因此无法正常工作.
如果用作装饰器,则property会将函数转换为getter;如果用作函数,则可以传入getter,setter,deleter和doc.
locals()返回所有本地人,因此您将拥有一个包含fget,fset,fdel,doc,Property和__init__的字典-导致property爆炸,因为它传递了太多参数.
就我个人而言,我喜欢@ x.setter和@ x.deleter样式,因为在类名空间中我不会以不必要的函数名结尾.
如果您必须定期使用2.4,只需自己滚动(或像我一样从2.6中窃取最新版本;):
class property(object):
"2.6 properties for 2.5-"
def __init__(self, fget=None, fset=None, fdel=None, doc=None):
self.fget = fget
self.fset = fset
self.fdel = fdel
self.__doc__ = doc or fget.__doc__
def __call__(self, func):
self.fget = func
if not self.__doc__:
self.__doc__ = fget.__doc__
def __get__(self, obj, objtype=None):
if obj is None:
return self
if self.fget is None:
raise AttributeError("unreadable attribute")
return self.fget(obj)
def __set__(self, obj, value):
if self.fset is None:
raise AttributeError("can't set attribute")
self.fset(obj, value)
def __delete__(self, obj):
if self.fdel is None:
raise AttributeError("can't delete attribute")
self.fdel(obj)
def setter(self, func):
self.fset = func
return self
def deleter(self, func):
self.fdel = func
return self