🐍 Укус питона 🐍
Відкрити в Telegram
🐍 Канал о программировании на языке Python. Тематические уроки и лайфхаки. 👽 Админ - @tg_adminisrator 🔊 Купить рекламу: https://telega.in/c/byteofpython 👉 Чат: @abyteofpython 👉 Поделиться с друзьями: @byteofpython
Показати більше2 334
Підписники
Немає даних24 години
-117 днів
-3730 день
Архів дописів
2 334
🔥 Mutable vs Immutable в Python
В 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().2 334
🔍 Как работает 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 не создаёт динамический словарь для атрибутов. Это особенно полезно при работе с большим количеством объектов.2 334
❓ Что делает
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-данных или динамических объектов.2 334
Зачем нужно ключевое слово
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 позволяет приостанавливать и возобновлять выполнение функции, экономя память и упрощая работу с потоками данных.2 334
⚡️ Как работает
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() особенно полезен при множественном наследовании, так как помогает вызывать методы родительских классов без явного указания их имен.2 334
Что такое дескрипторы в 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, логировании доступа и валидации данных. Они помогают гибко управлять состоянием объектов и позволяют писать более чистый код.2 334
⚙️ Как работает metaclass в Python?
В Python метаклассы управляют созданием классов, так же как классы управляют созданием объектов. Они позволяют автоматизировать и настраивать процесс создания классов.
✅ Пример:
class Meta(type):
def new(cls, name, bases, dct):
dct["custom_attr"] = 42
return super().new(cls, name, bases, dct)
class MyClass(metaclass=Meta):
pass
print(MyClass.custom_attr) # 42
Метаклассы позволяют добавлять атрибуты, проверять код, изменять поведение классов перед их созданием.
Это мощный инструмент, но его стоит использовать только при необходимости, например, в ORM, фреймворках и API.2 334
🔍 Как работает
staticmethod vs classmethod в Python?
В Python есть два специальных декоратора для методов класса: @staticmethod и @classmethod. Они позволяют работать без создания экземпляра, но имеют ключевые различия.
✅ Пример:
class Example:
class_attr = "Hello"
@staticmethod
def static_method():
return "I'm a static method"
@classmethod
def class_method(cls):
return f"Class method: {cls.class_attr}"
print(Example.static_method()) # I'm a static method
print(Example.class_method()) # Class method: Hello
@staticmethod ведёт себя как обычная функция внутри класса, не имея доступа к атрибутам класса или экземпляра. @classmethod, наоборот, получает ссылку на класс (cls) и может изменять его атрибуты.
Используйте @staticmethod для независимых функций, а @classmethod, когда нужно работать с самим классом.