要定义属性,我们可以使用
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
,但我不希望接口有来电()
。
答案 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