是否可以使用两个静态属性创建一个等效于以下类的等效项,一个是只读的,另一个是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中可能有read-only class properties,但我怎么没有在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
答案 0 :(得分:14)
我认为你想使用内置的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