在Python 2.5.1或更早版本中使用属性和setter

1 投票
2 回答
1225 浏览
提问于 2025-04-18 18:24

我该如何使用 @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这个装饰器。

所以,有两个解决办法:

  1. 不要把属性当作装饰器来用,而是当作一个函数来使用;
  2. 创建一个派生类,添加这些功能。

第一个解决办法:

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 版本中也能正常工作。

撰写回答