Давайте рассмотрим следующий пример класса:
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
, а вместо этого обрабатывает его как метод.Это можно увидеть, например, в раскрывающемся списке автозаполнения:
Myвопрос в том, как заставить PyCharm обрабатывать мой пользовательский декоратор свойств как фактическое свойство?