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

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

👉 Чат: @abyteofpython
👉 Поделиться с друзьями: @byteofpython
Download Telegram
👩‍💻 Протокол итерации — как работает цикл for под капотом

В Python любой объект можно сделать итерируемым, если он реализует протокол итерации — методы __iter__() и __next__().

Это основа работы for, генераторов, списковых включений и даже файлов


➡️ Пример:

class Counter:
def __init__(self, limit):
self.limit = limit
self.value = 0

def __iter__(self):
return self

def __next__(self):
if self.value < self.limit:
self.value += 1
return self.value
raise StopIteration

for i in Counter(3):
print(i)
# 1 2 3


📌 Цикл for просто вызывает next() до тех пор, пока не появится StopIteration.
Please open Telegram to view this post
VIEW IN 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))