成语定义一个类属性

时间:2014-06-19 12:03:38

标签: python properties idioms

要定义属性,我们可以使用

class MyClass(object):

    def __init__(f):
        self._f = f

    def custom_function(self):
        self._f += 1

    @property
    def f(self):
        return self._f

这样

>>x = MyClass(1)
>>print(x.f)  # prints 2

是否有任何标准方法来定义界面

>>MyClass.f  # <- calls custom classmethod

?即一个“@classproperty”。

我知道@classmethod,但我不希望接口有来电()

1 个答案:

答案 0 :(得分:1)

您有两个选择:将属性放在元类上,或者创建custom descriptor以将.__get__直接转换为函数调用,而不管上下文如何; property描述符仅在存在实例时执行此操作,在类上访问时返回self

元类:

class MetaClass(type):
    @property
    def f(cls):
        return cls._f

class MyClass(object):
    __metaclass__ = MetaClass

    def __init__(f):
        self._f = f

自定义描述符:

class classproperty(object):
    def __init__(self, getter):
        self.getter = getter

    def __get__(self, instance, cls):
        return self.getter(cls)

class MyClass(object):
    def __init__(f):
        self._f = f

    @classproperty
    def f(cls):
        return cls._f

请注意limitations to the latter approach