TGViewer
Python Заметки Python Заметки @pythonotes · 2.2K subscribers
Post #235 1.67K
Вы используете свойства (@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
>>> C._x
0

Чтобы setter тоже работал, нужно сделать иначе. Но об этом смотрите в следующем посте.

#tricks
GitHub GitHub - mammo0/py-simple-classproperty Contribute to mammo0/py-simple-classproperty development by creating an account on GitHub.
More from @pythonotes
  1. Sep 21, 2026­ WebAssembly это мощная технология позволяющая загружать практически любое приложение в б…
  2. Aug 17, 2026Не так давно столкнулся с API который в ответе с ошибкой присылал только статус-код. Без п…
  3. Jul 20, 2026У меня основная ОС это Linux. Но нередко требуется делать сборку клиента под Windows. Соби…
  4. Jul 13, 2026В прошлый раз был пример с понижением привелегий процесса. Проблема в том, что обратно под…
  5. Jul 6, 2026Модуль pwd может использоваться для считывания информации о пользователях из базы данных п…
  6. Jun 22, 2026Недавно я реализовал Multi Tenancy систему на FastAPI + SQLAlchemy и пересобрал её в небол…
Threads Profile ViewerView any public Threads profile without an account.Open ThreadLook →Writing with AI? Make it sound human.Metric37 rewrites AI drafts so they read naturally. Free AI detector, 1,500 words free.Try Metric37 →