🐍 Укус питона 🐍
2.46K subscribers
1.07K photos
26 videos
285 links
🐍 Канал о программировании на языке Python. Тематические уроки и лайфхаки.

👽 Админ - @it_dashka
🔊 Купить рекламу: https://telega.in/c/byteofpython

👉 Чат: @abyteofpython
👉 Поделиться с друзьями: @byteofpython
Download Telegram
👩‍💻 Протокол дескрипторов — скрытый механизм свойств и ORM

В 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))
👩‍💻 WeakRef — как избежать утечек памяти в Python

Иногда объект больше не нужен, но на него всё ещё ссылаются другие части программы. Обычная ссылка удерживает объект в памяти, а слабая ссылка (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