В Python за
@property, staticmethod, classmethod и даже ORM-поля стоит единый механизм — дескрипторы.Это объекты, которые управляют доступом к атрибутам через методы __get__, __set__, __delete__
class LoggedAttribute:
def __init__(self, name):
self.name = name
def __get__(self, instance, owner):
value = instance.__dict__.get(self.name)
print(f"Получено {self.name} = {value}")
return value
def __set__(self, instance, value):
print(f"Изменено {self.name} = {value}")
instance.__dict__[self.name] = value
class User:
age = LoggedAttribute("age")
u = User()
u.age = 30
print(u.age)
📌 При обращении к u.age срабатывают методы дескриптора, а не прямой доступ к атрибуту.
Please open Telegram to view this post
VIEW IN TELEGRAM
Что выведет код?
import itertools
lst = [[1, 2], [3]]
it = itertools.chain.from_iterable(lst)
print(next(it))
lst.append([4, 5])
print(list(it))
Иногда объект больше не нужен, но на него всё ещё ссылаются другие части программы. Обычная ссылка удерживает объект в памяти, а слабая ссылка (weak reference) — нет.
Она не мешает сборщику мусора удалить объект, если больше нет сильных ссылок
import weakref
class Data:
def __init__(self, name):
self.name = name
def __del__(self):
print(f"{self.name} удалён")
obj = Data("Test")
ref = weakref.ref(obj)
print(ref()) # <__main__.Data object at ...>
del obj
print(ref()) # None — объект собран GC
📌 weakref.ref() создаёт слабую ссылку: объект может быть удалён, даже если ссылка ещё существует.
Please open Telegram to view this post
VIEW IN TELEGRAM