@property) в классах?Удобная штука, скажу я вам! Но работают они только для инстансов класса. Вот простой пример:
class A:Создаём класс и получаем значение свойства
@property
def prop(self):
return 10
>>> a = A()А что будет если вызвать свойство у класса
>>> a.prop
10
>>> A.propЭх, несвезло😢
<property object at 0x000...318>
Как сделать подобие property для класса?
Есть несколько способов:
🔸 Написать свой декоратор в точности повторяющий функционал property. Это ведь не сложно🤓
Я тоже когда-то писал свою версию подобного функционала.
Примеры смотрим здесь↗️ и здесь↗️.
Всё это здорово, но не очень-то хочется изобретать велосипед. Есть ли что-то готовое из стандартных средств?
🔸 Если вы уже перешли на Python 3.9 то можете написать вот так:
class С:Например, вот так можно динамический докстринг сделать
@classmethod
@property
def x(cls):
return 2+2
>>> C.x
4
class C:Хорошая новость в том, что это работает из коробки, ничего дописывать не надо.
@classmethod
@property
def __doc__(cls) -> str:
return f"A doc for {cls.__name__!r}"
>>> help(C)
class C(builtins.object)
| A doc for 'C'
...
Плохая новость — не получится сделать setter, по крайней мере лаконично и красиво.
Например, вот так не работает:
class C:Выражение присвоения просто перезаписывает атрибут
_x = 0
def x_get(cls):
return cls._x
def x_set(cls, value):
cls._x = value
x = classmethod(property(x_get, x_set))
x, а не вызывает setter.>>> C.x = 1Чтобы setter тоже работал, нужно сделать иначе. Но об этом смотрите в следующем посте.
>>> C._x
0
#tricks