В 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
В 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))