TGViewer
Python Заметки Python Заметки @pythonotes · 2.2K subscribers
Post #236 2.17K
Продолжаем со свойствами классов. Теперь мы хотим иметь рабочий setter.

🔸 Вместо класса создаем свойства для его мета-класса

class CMeta(type):
_x = 0
@property
def x(cls):
return cls._x
@x.setter
def x(cls, value):
cls._x = value

class C(metaclass=CMeta):
_x = 2

При этом можем изменить дефолтное значение для унаследованного класса. Плюс, как и в обычном property можно сделать getter, setter и deleter.

>>> C.x
2
>>> C.x = 34
>>> C.x
34

Проверим, действительно ли сработал setter или мы просто перезаписали атрибут x

>>> C._x
34

Да, всё верно! 😎

🔸 Динамический атрибут класса. Похож на прошлый пример но с дополнительной фишкой.
Что он делает? Этот декоратор не только позволяет добавить свойство класса но и разделить функционал для свойства класса и свойства инстанса.

Работает это через дополнительный вызов __getattr__ и __setattr__ мета-класса, где требуется проверить имя атрибута и сделать соответствующие выводы.

from types import DynamicClassAttribute

class CMeta(type):
def __getattr__(self, item):
if item == 'x': # проверка имени
return 'x from class'
raise AttributeError
def __setattr__(self, key, value):
print('set class', key, '=', value)

class C(metaclass=CMeta):
@DynamicClassAttribute
def x(self):
return 'x from instance'
@x.setter
def x(self, value):
print('set instance x =', value)

>>> C.x
'from class'
>>> C().x
'from instance'
>>> C.x = 2
'set class x = 2'
C().x = 2
'set instance x = 2'

#tricks
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 →