属性是在类上创建的,但会影响实例。因此,如果要使用
classmethod属性,请在元类上创建该属性。
>>> 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.var5>>> foo.var = 3>>> foo.var3
但是由于无论如何都使用元类,因此只要将类方法移入其中,它就会更好看。
>>> 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.var5>>> foo.var = 3>>> foo.var3
或者,使用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.var5>>> foo.var = 3>>> foo.var3



