在Python 2.5.1或更早版本中使用属性和setter
我该如何使用 @property.setter
,因为在Python 2.5.1版本中并没有这个功能。
这里有一个在新版本Python中如何使用的例子。
由于我使用的是较旧的Python版本,所以无法真正使用这段代码。
class Info(object):
def __init__(self):
self.x = None
@property
def x(self):
return self.x
@x.setter
def x(self, value):
self.x = value
test = Info()
test.x = "It works!"
print(test.x)
输出:它可以工作!
2 个回答
2
在2.5版本中,属性支持fget、fset和fdel这几个功能,但不支持@property.setter这个装饰器。
所以,有两个解决办法:
- 不要把属性当作装饰器来用,而是当作一个函数来使用;
- 创建一个派生类,添加这些功能。
第一个解决办法:
class Info(object):
def __init__(self):
self._x = None
def get_x(self):
return self._x
def set_x(self, value):
self._x = value
x = property(get_x, set_x)
第二个解决办法:
class _property(__builtin__.property):
def getter(self, fget):
return __builtin__.property(fget, self.fset, self.fdel)
def setter(self, fset):
return __builtin__.property(self.fget, fset, self.fdel)
def deleter(self, fdel):
return __builtin__.property(self.fget, self.fset, fdel)
try:
property.getter
except AttributeError:
property = _property
1
这里有一种方法可以实现这个功能。你可以用 __get__
和 __set__
来替代。这种方法适用于 Python 2.5.1 或更早的版本。
class Info(object):
def __init__(self):
self.x = None
class x:
def __init__(self):
pass
def __get__(self, instance):
return instance.x
def __set__(self, instance, value):
instance.x = value
test = Info()
test.x = "It works too, in 2.5.1"
print(test.x)
输出结果:在 2.5.1 版本中也能正常工作。