Проблема, с которой вы сталкиваетесь, заключается в том, что property
, как бы удобная вещь в Python, не была разработана для полного выполнения всех возможных вариантов использования.
Это хорошее использование протокола дескриптора, и предназначен для свойств экземпляра и просто остается доступным сам по себе при вызове из класса.
Наличие анолога к property
, который будет работать как из класса, так и из экземпляра, - это просто вопрос написания класса при правильном методе __get__
- для фиксированной строки это может быть так просто:
class MyProperty:
def __init__(self, value):
self.value = value
def __get__(self, instance, owner):
return self.value
class MyClass:
cls_prop = MyProperty("foo")
(большая разница в свойстве - возвращать значение, даже если "instance" - None) *
И, если хотите, вы можете заново реализовать тонкости свойств, например, иметь возможность работать в качестве декоратора, а также иметь декораторы для setter
и deleter
.