Что такое дескрипторы в Python и зачем они нужны?
Дескриптор — это объект, который управляет доступом к атрибутам класса через методы
✅ Пример:
Дескрипторы используются в свойствах (
Дескриптор — это объект, который управляет доступом к атрибутам класса через методы
get
, set
и delete
. Они позволяют гибко контролировать поведение атрибутов.✅ Пример:
class Descriptor:
def init(self, value=None):
self.value = value
def get(self, instance, owner):
print("Getting value")
return self.value
def set(self, instance, value):
print("Setting value")
self.value = value
class MyClass:
attr = Descriptor()
obj = MyClass()
obj.attr = 42 # Setting value
print(obj.attr) # Getting value → 42
Дескрипторы используются в свойствах (
property
), ORM, логировании доступа и валидации данных. Они помогают гибко управлять состоянием объектов и позволяют писать более чистый код.⚡️ Как работает
✅ Пример:
super()
в Python?super()
позволяет вызывать методы родительского класса, обеспечивая правильное наследование и расширение функционала.✅ Пример:
class Parent:
def greet(self):
return "Hello from Parent"
class Child(Parent):
def greet(self):
return super().greet() + " and Child"
obj = Child()
print(obj.greet()) # "Hello from Parent and Child"
super()
особенно полезен при множественном наследовании, так как помогает вызывать методы родительских классов без явного указания их имен.Зачем нужно ключевое слово
Пример:
yield
в Python?yield
используется для создания генераторов, которые возвращают данные по мере запроса, вместо хранения всего результата в памяти.Пример:
def count_up_to(n):
count = 1
while count <= n:
yield count # Возвращает значение и приостанавливает выполнение
count += 1
for num in count_up_to(5):
print(num)
yield
позволяет приостанавливать и возобновлять выполнение функции, экономя память и упрощая работу с потоками данных.❓ Что делает
Функция
✅ Пример:
📌 Если атрибута нет, можно передать значение по умолчанию, чтобы избежать ошибки:
getattr()
в Python и когда его использовать?Функция
getattr()
позволяет динамически получать атрибут объекта по его имени в виде строки. Это удобно, когда атрибут неизвестен заранее.✅ Пример:
class Person:
def init(self, name, age):
self.name = name
self.age = age
p = Person("Alice", 30)
print(getattr(p, "name")) # Alice
📌 Если атрибута нет, можно передать значение по умолчанию, чтобы избежать ошибки:
print(getattr(p, "city", "Не указано")) # Не указано
getattr()
полезен, когда нужно работать с атрибутами гибко, например, при обработке конфигураций, JSON-данных или динамических объектов.Что выведет код?
Anonymous Quiz
70%
[(1, "a"), (2, "b"), (3, "c")]
23%
[[1, "a"], [2, "b"], [3, "c"]]
5%
[(1, "b"), (2, "c"), (3, "a")]
2%
Ошибка выполнения
🔍 Как работает slots в Python и зачем его использовать?
✅ Пример:
Использование
slots
— это механизм, который ограничивает атрибуты объекта и уменьшает потребление памяти, исключая хранение dict
.✅ Пример:
class Person:
slots = ("name", "age") # Разрешены только эти атрибуты
def init(self, name, age):
self.name = name
self.age = age
p = Person("Alice", 30)
p.city = "New York" # ❌ AttributeError: 'Person' object has no attribute 'city'
Использование
slots
делает объекты легче и быстрее, так как Python не создаёт динамический словарь для атрибутов. Это особенно полезно при работе с большим количеством объектов.🔥 Mutable vs Immutable в Python
В Python все данные — это объекты, и они делятся на изменяемые (mutable) и неизменяемые (immutable).
🔹 Неизменяемые (immutable): нельзя изменить после создания
✅
🔹 Изменяемые (mutable): можно изменять без создания нового объекта
✅
⚠️ Важный нюанс
Передача изменяемых объектов в функцию может привести к неожиданным изменениям:
✅ Вывод:
В Python все данные — это объекты, и они делятся на изменяемые (mutable) и неизменяемые (immutable).
🔹 Неизменяемые (immutable): нельзя изменить после создания
✅
int
, float
, str
, tuple
, frozenset
x = "hello"
x += " world" # Создается новый объект, а не изменяется старый
🔹 Изменяемые (mutable): можно изменять без создания нового объекта
✅
list
, dict
, set
, bytearray
lst = [1, 2, 3]
lst.append(4) # Список изменяется в той же области памяти
⚠️ Важный нюанс
Передача изменяемых объектов в функцию может привести к неожиданным изменениям:
def modify_list(lst):
lst.append(99) # Изменяет оригинальный список!
my_list = [1, 2, 3]
modify_list(my_list)
print(my_list) # [1, 2, 3, 99]
✅ Вывод:
•
Используйте tuple
, если данные не должны изменяться.•
Будьте осторожны с изменяемыми объектами при передаче в функции.•
Если нужно копирование, используйте .copy()
или deepcopy()
.🔥 lambda — короткие функции в Python
✅ Пример (обычная функция vs. lambda):
🔹 Где используется?
1️⃣
2️⃣
3️⃣
⚡️ Когда использовать
❌ Не стоит использовать
lambda
— это анонимная функция, которая записывается в одну строку и не требует def
. Используется там, где нужна простая операция без имени функции.✅ Пример (обычная функция vs. lambda):
def square(x):
return x ** 2
square_lambda = lambda x: x ** 2
print(square(5)) # 25
print(square_lambda(5)) # 25
🔹 Где используется?
1️⃣
map()
— Применение функции к спискуnums = [1, 2, 3, 4]
squared = list(map(lambda x: x ** 2, nums))
print(squared) # [1, 4, 9, 16]
2️⃣
filter()
— Фильтрация данныхeven = list(filter(lambda x: x % 2 == 0, nums))
print(even) # [2, 4]
3️⃣
sorted()
— Сортировка по ключуpairs = [(1, 'one'), (3, 'three'), (2, 'two')]
pairs.sort(key=lambda x: x[0])
print(pairs) # [(1, 'one'), (2, 'two'), (3, 'three')]
⚡️ Когда использовать
lambda
?•
Когда функция простая и короткая•
Когда она нужна один раз❌ Не стоит использовать
lambda
, если логика сложная – лучше писать def
.