Python 静态类属性 set/get



可能的重复项:
python中的私有函数/变量执行

是否可以创建一个等效于以下类,具有两个静态属性,一个是只读的,另一个是 Python 中的读写属性?

class Foo
{
    private static string _rdy = "RO";
    public static string rd
    {
        get { return _rd; }
    }
    private static string _rw = "RW";
    public static string rw
    {
        get { return _rw ; }
        set { _rw = value; }
    }
}

我知道只读类属性在 Python 中是可能的,但我怎么在 Python 中没有看到任何读写类属性的例子。 可能吗? 基本上我想要:

class classproperty(object):
    def __init__(self, getter
            #, setter
        ):
        self.getter = getter
    #    self.setter = setter
    def __get__(self, instance, owner):
        return self.getter(owner)
    # Could there be a __set__ here?
    #vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv
    #def __set__(self, instance, owner, value):
    #    self.setter(owner, value)
    #^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
class Foo(object):
    _ro = "RO"
    _rw = "RW"
    @classproperty
    def ro(cls):
        return cls._ro
    # How would you this?
    #vvvvvvvvvvvvvvvvvvvv
    #@classproperty.setter
    #^^^^^^^^^^^^^^^^^^^^
    #def rw(cls, value):
    #    cls._rw, value
# This is what I need
>>> Foo.ro
RO
>>> Foo.ro = 'X'     # Hypothetical Exception
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AttributeError: class 'Foo' attribute 'ro' is not writable!
>>> Foo.rw
RW
>>> Foo.rw = 'NEW'
>>> Foo.rw
NEW

我想你想使用内置的property() http://docs.python.org/2/library/functions.html#property

虽然传统上,它是在实例上使用的,但我认为您可以在元类上使用它来实现您想要的。

class MetaFoo(type):
    _ro = "RO"
    _rw = "RW"
    def _get_ro(self):
        return self._ro
    def _get_rw(self):
        return self._rw
    def _set_ro(self, value):
        raise AttributeError("class 'Foo' attribute 'ro' is not writable!")
    def _set_rw(self, value):
        self._rw = value
    ro = property(_get_ro, _set_ro)
    rw = property(_get_rw, _set_rw)

class Foo(object):
    __metaclass__=MetaFoo

assert Foo.rw == "RW"
Foo.rw = 'NEW'
assert Foo.rw == "NEW"
assert Foo.ro == "RO"
try:
    Foo.ro = 'X'
except Exception as e:
    assert str(e) == "class 'Foo' attribute 'ro' is not writable!", str(e)
    assert type(e) == AttributeError

最新更新