<p>属性是在类上创建的,但会影响实例。因此,如果需要classmethod属性,请在元类上创建该属性。</p>
<pre><code>>>> class foo(object):
... _var = 5
... class __metaclass__(type): # Python 2 syntax for metaclasses
... pass
... @classmethod
... def getvar(cls):
... return cls._var
... @classmethod
... def setvar(cls, value):
... cls._var = value
...
>>> foo.__metaclass__.var = property(foo.getvar.im_func, foo.setvar.im_func)
>>> foo.var
5
>>> foo.var = 3
>>> foo.var
3
</code></pre>
<p>但是既然你使用的是一个元类,如果你把类方法移到其中,它会读得更好。</p>
<pre><code>>>> class foo(object):
... _var = 5
... class __metaclass__(type): # Python 2 syntax for metaclasses
... @property
... def var(cls):
... return cls._var
... @var.setter
... def var(cls, value):
... cls._var = value
...
>>> foo.var
5
>>> foo.var = 3
>>> foo.var
3
</code></pre>
<p>或者,使用Python 3的<code>metaclass=...</code>语法,以及在<code>foo</code>类主体外部定义的元类,以及负责设置<code>_var</code>初始值的元类:</p>
<pre><code>>>> class foo_meta(type):
... def __init__(cls, *args, **kwargs):
... cls._var = 5
... @property
... def var(cls):
... return cls._var
... @var.setter
... def var(cls, value):
... cls._var = value
...
>>> class foo(metaclass=foo_meta):
... pass
...
>>> foo.var
5
>>> foo.var = 3
>>> foo.var
3
</code></pre>