让我们考虑以下示例类:
class Foo:
def __init__(self):
self._bar = None
@property
def bar(self):
if self._bar is None:
self._bar = ... # a long computation
return self._bar
我创建了一个cachedproperty
装饰器,以隐式地将计算结果存储为类实例的成员。这是此类装饰器类的简化示例:
class cachedproperty(property):
def __init__(self, fget):
@functools.wraps(fget)
def cfget(obj):
name = '_' + fget.__name__
if not hasattr(obj, name):
setattr(obj, name, fget(obj))
return getattr(obj, name)
super().__init__(cfget)
现在类Foo
看起来像这样:
class Foo:
@cachedproperty
def bar(self):
return ... # a long computation
尽管可以使用,但PyCharm现在无法将bar
视为Foo
的属性,而将其视为方法却有些不便。例如,可以在自动完成下拉列表中看到这一点:
我的问题是:如何强制PyCharm将自定义属性装饰器视为实际属性?
答案 0 :(得分:1)
PyCharm似乎完全基于装饰者的名字做出此决定。例如,将您的cachedproperty
装饰器重命名为cached_property
(以使其与该名称的Django's decorator匹配)有效:
…而使用内置property
装饰器使用不同的名称则不会: