成语定义类属性

豪尔赫·雷涛(Jorge Leitao)

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

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但我不希望该界面有电话()

马丁·彼得斯(Martijn Pieters)

您有两个选择:在元类上放置一个属性,或创建一个自定义描述符以将a.__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

请注意,后一种方法存在局限性

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章