属性是在类上创建的,但会影响实例。因此,如果要使用classmethod
属性,请在元类上创建该属性。
>>> class foo(object):
... _var = 5
... class __Metaclass__(type): # Python 2 @R_301_1452@ 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
但是由于无论如何都使用元类,因此只要将类方法移入其中,它就会更好看。
>>> class foo(object):
... _var = 5
... class __Metaclass__(type): # Python 2 @R_301_1452@ 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
或者,使用Python 3的Metaclass=...
语法,在foo类主体外部定义的元类,以及负责设置初始值的元类_var:
>>> 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