1. Переменная не содержит сам объект, а указывает на него.
2. Тип объекта определяется автоматически, а его управление памятью осуществляется сборщиком мусора.
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Добро пожаловать в канал Python | Вопросы собесов! Здесь мы разбираем вопросы, которые могут встретиться на собеседованиях для Python разработчиков. Если вы интересуетесь Django, Flask, или FastApi, то вы попали по адресу. На нашем канале вы найдете полезные материалы, советы и рекомендации по подготовке к собеседованию. Мы поможем вам успешно пройти собеседование и получить желаемую работу в сфере Python разработки. Кроме того, на нашем канале есть возможность размещения рекламы, а также ссылки на тесты, задачи и вакансии для Python разработчиков. Присоединяйтесь к нам и станьте профессионалом в области Python разработки!
18 Jan, 16:10
18 Jan, 09:10
__init__.py
и может содержать подкаталоги и модули. Подкаталоги в пакете также могут содержать файлыия import py
, что делает их под-пакетами. Пример структуры пакета:package/
py
item.py
subpackage/
py
subitem.py
import package.item
позволяет импортировать подмодуль item
из пакета package
. Например:import package.item
# Теперь вы можете использовать функции и классы из package.item
package.item.some_function()
math_operations/
py
addition.py
subtraction.py
def add(a, b):
return a + b
def subtract(a, b):
return a - b
import math_operations.addition
import math_operations.subtraction
result_add = math_operations.addition.add(5, 3)
result_subtract = math_operations.subtraction.subtract(5, 3)
print("Addition:", result_add) # Выведет: Addition: 8
print("Subtraction:", result_subtract) # Выведет: Subtraction: 2
17 Jan, 16:10
17 Jan, 09:10
GET https://api.example.com/users/123
GET
— для получения данных.POST
— для создания новых данных.PUT
или PATCH
— для обновления данных.DELETE
— для удаления данных.16 Jan, 16:10
16 Jan, 09:10
BaseExceptionGroup
и ExceptionGroup
. Эти классы решают проблему одновременной обработки нескольких исключений, которые могут возникать в сложных ситуациях, таких как асинхронное программирование, многопоточность или обработка нескольких связанных ошибок. Давайте разберем, зачем они нужны, как их использовать и какие преимущества они дают.asyncio
) может быть необходимость передать сразу несколько исключений, которые произошли в разных местах, как единый объект.BaseExceptionGroup
и его подкласс ExceptionGroup
позволяют группировать несколько исключений и выбрасывать их вместе в виде одного объекта. Это делает код более читаемым, упрощает обработку и исключает необходимость ручной агрегации ошибок.BaseExceptionGroup
- это базовый класс для группировки исключений. Он наследуется от BaseException
и, как правило, не используется напрямую.ExceptionGroup
- это подкласс, который наследуется от Exception
. Этот класс используется для обработки групп исключений, которые возникают при обычных ошибках в коде (не фатальных).BaseExceptionGroup
и ExceptionGroup
позволяют создать "группу исключений", которая содержит несколько отдельных исключений. Это полезно, когда вам нужно:def task_1():
raise ValueError("Ошибка в задаче 1")
def task_2():
raise TypeError("Ошибка в задаче 2")
try:
# Создаем группу исключений
raise ExceptionGroup(
"Ошибки в задачах",
[ValueError("Ошибка в задаче 1"), TypeError("Ошибка в задаче 2")]
)
except ExceptionGroup as eg:
for exc in eg.exceptions:
print(f"Обнаружено исключение: {exc}")
Обнаружено исключение: Ошибка в задаче 1
Обнаружено исключение: Ошибка в задаче 2
ExceptionGroup
можно использовать механизм фильтрации с помощью конструкции except*
. Это нововведение в Python 3.11 позволяет обрабатывать разные типы исключений внутри группы по-разному.try:
raise ExceptionGroup(
"Ошибки в задачах",
[ValueError("Ошибка 1"), TypeError("Ошибка 2"), ValueError("Ошибка 3")]
)
except* ValueError as ve:
print("Обрабатываем ValueError:", ve)
except* TypeError as te:
print("Обрабатываем TypeError:", te)
Обрабатываем ValueError: Ошибка 1
Обрабатываем ValueError: Ошибка 3
Обрабатываем TypeError: Ошибка 2
except*
позволяет обработать каждое исключение из группы отдельно, не теряя гибкости.asyncio
) часто возникает несколько ошибок одновременно, и их можно группировать для дальнейшей обработки.15 Jan, 16:10
15 Jan, 09:10
Future
или asyncio.Task
).import asyncio
async def fetch_data():
print("Начинаем загрузку данных...")
await asyncio.sleep(2) # Асинхронная пауза (имитирует длительную операцию)
print("Данные загружены!")
return {"data": "some data"}
async def main():
print("Старт программы")
data = await fetch_data()
print(f"Результат: {data}")
print("Конец программы")
# Запуск цикла событий
asyncio.run(main())
import threading
import time
def task(name):
print(f"Начало задачи {name}")
time.sleep(2) # Имитация длительной операции
print(f"Конец задачи {name}")
# Создаем и запускаем потоки
thread1 = threading.Thread(target=task, args=("A",))
thread2 = threading.Thread(target=task, args=("B",))
thread1.start()
thread2.start()
# Ожидаем завершения потоков
thread1.join()
thread2.join()
print("Все задачи завершены")
14 Jan, 16:10
14 Jan, 09:10
employees = [
{"name": "Alice", "age": 30, "salary": 70000},
{"name": "Bob", "age": 25, "salary": 50000},
{"name": "Charlie", "age": 35, "salary": 120000}
]
# Сортировка по возрасту
sorted_employees = sorted(employees, key=lambda x: x["age"])
print(sorted_employees)
[{'name': 'Bob', 'age': 25, 'salary': 50000},
{'name': 'Alice', 'age': 30, 'salary': 70000},
{'name': 'Charlie', 'age': 35, 'salary': 120000}]
employees = [
{"name": "Alice", "age": 30, "salary": 70000},
{"name": "Bob", "age": 25, "salary": 50000},
{"name": "Charlie", "age": 35, "salary": 120000}
]
# Сортировка по зарплате
employees.sort(key=lambda x: x["salary"])
print(employees)
[{'name': 'Bob', 'age': 25, 'salary': 50000},
{'name': 'Alice', 'age': 30, 'salary': 70000},
{'name': 'Charlie', 'age': 35, 'salary': 120000}]
sorted_employees_desc = sorted(employees, key=lambda x: x["age"], reverse=True)
print(sorted_employees_desc)
from operator import itemgetter
sorted_employees = sorted(employees, key=itemgetter("age"))
print(sorted_employees)
employees = [
{"name": "Alice", "age": 30},
{"name": "Bob"},
{"name": "Charlie", "age": 35}
]
sorted_employees = sorted(employees, key=lambda x: x.get("age", 0))
print(sorted_employees)
[{'name': 'Bob'},
{'name': 'Alice', 'age': 30},
{'name': 'Charlie', 'age': 35}]
13 Jan, 16:10
13 Jan, 09:10
self
, который ссылается на экземпляр класса.class MyClass:
def __init__(self, value):
self.value = value
def increment(self):
self.value += 1
# Использование
obj = MyClass(10)
obj.increment()
print(obj.value) # Вывод: 11
cls
, который ссылается на класс. Методы класса обозначаются декоратором @classmethod
.class MyClass:
count = 0
def __init__(self):
MyClass.count += 1
@classmethod
def get_count(cls):
return cls.count
# Использование
obj1 = MyClass()
obj2 = MyClass()
print(MyClass.get_count()) # Вывод: 2
class MyClass:
@staticmethod
def greet(name):
return f"Hello, {name}!"
# Использование
print(MyClass.greet("Alice")) # Вывод: Hello, Alice!
class MyClass:
def init(self, value):
self.value = value
obj = MyClass(10)
class MyClass:
def init(self, value):
self.value = value
def str(self):
return f"MyClass with value: {self.value}"
obj = MyClass(10)
print(obj) # Вывод: MyClass with value: 10
class MyList:
def __init__(self, items):
self.items = items
def __getitem__(self, index):
return self.items[index]
def __setitem__(self, index, value):
self.items[index] = value
def __delitem__(self, index):
del self.items[index]
lst = MyList([1, 2, 3])
print(lst[1]) # Вывод: 2
lst[1] = 20
print(lst[1]) # Вывод: 20
del lst[1]
print(lst.items) # Вывод: [1, 3]
🟠
__enter__, __exit__with
.```python
class ManagedResource:
def enter(self):
print("Entering the context")
return self
def exit(self, exc_type, exc_value, traceback):
print("Exiting the context")
return False
with ManagedResource():
print("Inside the context")
12 Jan, 16:10
12 Jan, 09:10
==
, !=
, <
, <=
, >
, и >=
.==
). Он вызывается, когда нужно проверить, равны ли два объекта.class Person:
def __init__(self, name, age):
self.name = name
self.age = age
def __eq__(self, other):
if isinstance(other, Person):
return self.name == other.name and self.age == other.age
return False
# Использование
p1 = Person("Alice", 30)
p2 = Person("Alice", 30)
p3 = Person("Bob", 25)
print(p1 == p2) # Вывод: True
print(p1 == p3) # Вывод: False
!=
). Он вызывается, когда нужно проверить, не равны ли два объекта.class Person:
def __init__(self, name, age):
self.name = name
self.age = age
def __ne__(self, other):
if isinstance(other, Person):
return self.name != other.name or self.age != other.age
return True
# Использование
p1 = Person("Alice", 30)
p2 = Person("Alice", 30)
p3 = Person("Bob", 25)
print(p1 != p2) # Вывод: False
print(p1 != p3) # Вывод: True
<
). Он вызывается, когда нужно проверить, меньше ли один объект другого.class Person:
def __init__(self, name, age):
self.name = name
self.age = age
def __lt__(self, other):
if isinstance(other, Person):
return self.age < other.age
return NotImplemented
# Использование
p1 = Person("Alice", 30)
p2 = Person("Bob", 25)
print(p1 < p2) # Вывод: False
print(p2 < p1) # Вывод: True
<=
). Он вызывается, когда нужно проверить, меньше ли или равен один объект другому.class Person:
def __init__(self, name, age):
self.name = name
self.age = age
def __le__(self, other):
if isinstance(other, Person):
return self.age <= other.age
return NotImplemented
# Использование
p1 = Person("Alice", 30)
p2 = Person("Bob", 25)
p3 = Person("Charlie", 30)
print(p1 <= p2) # Вывод: False
print(p2 <= p1) # Вывод: True
print(p1 <= p3) # Вывод: True
11 Jan, 16:10
11 Jan, 09:10
__bool__
является специальным методом, который позволяет определить, как объект будет оцениваться в логическом контексте. Этот метод должен возвращать булево значение (True
или False
), которое указывает на истинность или ложность объекта.bool()
и в условиях (например, в инструкциях if
и while
). Если объект не имеет метода bool, Python вызывает метод len, и если len возвращает ноль, объект считается ложным.class Box:
def __init__(self, items):
self.items = items
def __bool__(self):
return bool(self.items)
def __repr__(self):
return f"Box({self.items})"
# Использование
box1 = Box([1, 2, 3])
box2 = Box([])
print(bool(box1)) # Вывод: True
print(bool(box2)) # Вывод: False
if box1:
print("box1 is not empty") # Вывод: box1 is not empty
if not box2:
print("box2 is empty") # Вывод: box2 is empty
class Box:
def __init__(self, items):
self.items = items
def __len__(self):
return len(self.items)
def __repr__(self):
return f"Box({self.items})"
# Использование
box1 = Box([1, 2, 3])
box2 = Box([])
print(bool(box1)) # Вывод: True
print(bool(box2)) # Вывод: False
if box1:
print("box1 is not empty") # Вывод: box1 is not empty
if not box2:
print("box2 is empty") # Вывод: box2 is empty
10 Jan, 16:10
10 Jan, 09:10
+
). Он вызывается, когда используется оператор +
между двумя объектами.class Vector:
def __init__(self, x, y):
self.x = x
self.y = y
def __add__(self, other):
return Vector(self.x + other.x, self.y + other.y)
def __repr__(self):
return f"Vector({self.x}, {self.y})"
# Использование
v1 = Vector(1, 2)
v2 = Vector(3, 4)
v3 = v1 + v2
print(v3) # Вывод: Vector(4, 6)
*
). Он вызывается, когда используется оператор *
между двумя объектами.class Vector:
def __init__(self, x, y):
self.x = x
self.y = y
def __mul__(self, scalar):
return Vector(self.x * scalar, self.y * scalar)
def __repr__(self):
return f"Vector({self.x}, {self.y})"
# Использование
v = Vector(1, 2)
v2 = v * 3
print(v2) # Вывод: Vector(3, 6)
-
). Он вызывается, когда используется оператор -
между двумя объектами.class Vector:
def __init__(self, x, y):
self.x = x
self.y = y
def __sub__(self, other):
return Vector(self.x - other.x, self.y - other.y)
def __repr__(self):
return f"Vector({self.x}, {self.y})"
# Использование
v1 = Vector(5, 7)
v2 = Vector(2, 3)
v3 = v1 - v2
print(v3) # Вывод: Vector(3, 4)
/
). Он вызывается, когда используется оператор /
между двумя объектами.class Vector:
def __init__(self, x, y):
self.x = x
self.y = y
def __truediv__(self, scalar):
return Vector(self.x / scalar, self.y / scalar)
def __repr__(self):
return f"Vector({self.x}, {self.y})"
# Использование
v = Vector(6, 8)
v2 = v / 2
print(v2) # Вывод: Vector(3.0, 4.0)
09 Jan, 16:10
09 Jan, 12:56
07 Jan, 16:10
07 Jan, 09:10
__init__
. Этот метод вызывается автоматически при создании нового объекта класса и используется для инициализации атрибутов объекта.class Person:
def __init__(self, name, age):
self.name = name
self.age = age
def display(self):
print(f"Name: {self.name}, Age: {self.age}")
# Создание экземпляра класса Person
person1 = Person("Alice", 30)
person1.display() # Вывод: Name: Alice, Age: 30
person2 = Person("Bob", 25)
person2.display() # Вывод: Name: Bob, Age: 25
args
и kwargs
для имитации перегрузки.#include <iostream>
using namespace std;
class Person {
public:
string name;
int age;
// Конструктор по умолчанию
Person() {
name = "Unknown";
age = 0;
}
// Конструктор с параметрами
Person(string n, int a) {
name = n;
age = a;
}
void display() {
cout << "Name: " << name << ", Age: " << age << endl;
}
};
int main() {
Person person1;
person1.display(); // Вывод: Name: Unknown, Age: 0
Person person2("Alice", 30);
person2.display(); // Вывод: Name: Alice, Age: 30
return 0;
}
06 Jan, 16:10
06 Jan, 09:10
class A:
pass
class B(A):
pass
class C(A):
pass
class D(B, C):
pass
class A:
def method(self):
print("A")
class B(A):
def method(self):
print("B")
class C(A):
def method(self):
print("C")
class D(B, C):
pass
d = D()
d.method() # Вывод: B
05 Jan, 16:10
05 Jan, 09:10
class A:
def method(self):
print("Method from class A")
class B:
def method(self):
print("Method from class B")
class C(A, B):
pass
c = C()
c.method() # Вывод: Method from class A (MRO выбрал метод из класса A)
class Engine:
def start(self):
print("Engine started")
class Car:
def __init__(self):
self.engine = Engine()
def start(self):
self.engine.start()
print("Car started")
car = Car()
car.start()
04 Jan, 16:10
04 Jan, 09:10
__enter__
и exit являются частью протокола менеджера контекста. Они позволяют объектам определять поведение в контексте оператора with
. Эти методы обеспечивают безопасное и автоматическое управление ресурсами, такими как файлы, сетевые соединения и другие объекты, которые требуют явного открытия и закрытия.with
и возвращает объект, который будет присвоен переменной, указанной после as
.with
, независимо от того, произошло исключение или нет. Он используется для очистки и освобождения ресурсов.class ManagedResource:
def __enter__(self):
print("Entering the context")
return self
def __exit__(self, exc_type, exc_value, traceback):
print("Exiting the context")
if exc_type:
print(f"Exception type: {exc_type}")
print(f"Exception value: {exc_value}")
print(f"Traceback: {traceback}")
return True # True указывает на то, что исключение было обработано
# Использование
with ManagedResource() as resource:
print("Inside the context")
print("Outside the context")
class FileManager:
def __init__(self, filename, mode):
self.filename = filename
self.mode = mode
def __enter__(self):
self.file = open(self.filename, self.mode)
return self.file
def __exit__(self, exc_type, exc_value, traceback):
self.file.close()
if exc_type:
print(f"Exception type: {exc_type}")
print(f"Exception value: {exc_value}")
print(f"Traceback: {traceback}")
return True
# Использование
with FileManager("example.txt", "w") as f:
f.write("Hello, World!")
print("File operation completed")
03 Jan, 16:10
03 Jan, 09:10
obj[key]
).class CustomList:
def __init__(self, items):
self.items = items
def __getitem__(self, index):
return self.items[index]
# Использование
my_list = CustomList([1, 2, 3, 4, 5])
print(my_list[2]) # Вывод: 3
obj[key] = value
).class CustomList:
def __init__(self, items):
self.items = items
def __setitem__(self, index, value):
self.items[index] = value
# Использование
my_list = CustomList([1, 2, 3, 4, 5])
my_list[2] = 10
print(my_list.items) # Вывод: [1, 2, 10, 4, 5]
del obj[key]
).class CustomList:
def __init__(self, items):
self.items = items
def __delitem__(self, index):
del self.items[index]
# Использование
my_list = CustomList([1, 2, 3, 4, 5])
del my_list[2]
print(my_list.items) # Вывод: [1, 2, 4, 5]
class CustomDict:
def __init__(self):
self.items = {}
def __getitem__(self, key):
return self.items[key]
def __setitem__(self, key, value):
self.items[key] = value
def __delitem__(self, key):
del self.items[key]
def __repr__(self):
return f"{self.items}"
# Использование
my_dict = CustomDict()
my_dict['a'] = 1
my_dict['b'] = 2
print(my_dict['a']) # Вывод: 1
print(my_dict) # Вывод: {'a': 1, 'b': 2}
del my_dict['a']
print(my_dict) # Вывод: {'b': 2}
02 Jan, 16:10
02 Jan, 09:10
typ
), который для JWT равен "JWT".alg
), например, HMAC SHA256 или RSA.{
"alg": "HS256",
"typ": "JWT"
}
{
"sub": "1234567890",
"name": "John Doe",
"admin": true
}
HMACSHA256(
base64UrlEncode(header) + "." + base64UrlEncode(payload),
secret
)
pip install pyjwt
import jwt
import datetime
# Секретный ключ
secret_key = "your-256-bit-secret"
# Заголовок
header = {
"alg": "HS256",
"typ": "JWT"
}
# Полезная нагрузка
payload = {
"sub": "1234567890",
"name": "John Doe",
"admin": True,
"exp": datetime.datetime.utcnow() + datetime.timedelta(seconds=30) # Время истечения действия токена
}
# Создание JWT
token = jwt.encode(payload, secret_key, algorithm="HS256", headers=header)
print(token)
import jwt
# Секретный ключ
secret_key = "your-256-bit-secret"
# Декодирование JWT
try:
decoded_payload = jwt.decode(token, secret_key, algorithms=["HS256"])
print(decoded_payload)
except jwt.ExpiredSignatureError:
print("Signature has expired")
except jwt.InvalidTokenError:
print("Invalid token")
01 Jan, 16:16
01 Jan, 16:10
01 Jan, 09:10
__call__
является специальным методом, который позволяет экземплярам классов вести себя как функции. Если объект класса имеет данный метод, то этот объект можно вызывать, как если бы он был функцией. Это может быть полезно для создания объектов, которые действуют как замыкания, для реализации паттернов проектирования и других сценариев, требующих функциональности.class Counter:
def __init__(self):
self.count = 0
def __call__(self):
self.count += 1
return self.count
# Использование
counter = Counter()
print(counter()) # Вывод: 1
print(counter()) # Вывод: 2
print(counter()) # Вывод: 3
class Multiplier:
def __init__(self, factor):
self.factor = factor
def __call__(self, value):
return value * self.factor
# Использование
double = Multiplier(2)
triple = Multiplier(3)
print(double(5)) # Вывод: 10
print(triple(5)) # Вывод: 15
class CachedFibonacci:
def __init__(self):
self.cache = {}
def __call__(self, n):
if n in self.cache:
return self.cache[n]
if n <= 1:
return n
self.cache[n] = self(n - 1) + self(n - 2)
return self.cache[n]
# Использование
fibonacci = CachedFibonacci()
print(fibonacci(10)) # Вывод: 55
print(fibonacci(15)) # Вывод: 610
31 Dec, 16:10
31 Dec, 09:10
import socket
# Создание TCP-сокета
server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# Привязка сокета к адресу и порту
server_socket.bind(('localhost', 12345))
# Ожидание входящих соединений
server_socket.listen()
print('Сервер ожидает соединения...')
while True:
# Принятие нового соединения
client_socket, client_address = server_socket.accept()
print(f'Подключение от {client_address}')
# Получение данных от клиента
data = client_socket.recv(1024).decode()
print(f'Получено: {data}')
# Отправка ответа клиенту
client_socket.sendall('Hello, Client!'.encode())
# Закрытие соединения
client_socket.close()
import socket
# Создание TCP-сокета
client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# Подключение к серверу
client_socket.connect(('localhost', 12345))
# Отправка данных серверу
client_socket.sendall('Hello, Server!'.encode())
# Получение ответа от сервера
data = client_socket.recv(1024).decode()
print(f'Получено: {data}')
# Закрытие соединения
client_socket.close()
import socket
# Создание UDP-сокета
server_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
# Привязка сокета к адресу и порту
server_socket.bind(('localhost', 12345))
print('UDP сервер ожидает сообщений...')
while True:
# Получение данных от клиента
data, client_address = server_socket.recvfrom(1024)
print(f'Получено от {client_address}: {data.decode()}')
# Отправка ответа клиенту
server_socket.sendto('Hello, Client!'.encode(), client_address)
import socket
# Создание UDP-сокета
client_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
# Отправка данных серверу
client_socket.sendto('Hello, Server!'.encode(), ('localhost', 12345))
# Получение ответа от сервера
data, server_address = client_socket.recvfrom(1024)
print(f'Получено: {data.decode()}')
# Закрытие сокета
client_socket.close()
30 Dec, 16:10
30 Dec, 09:10
django.contrib.auth.models.User
. Эта модель включает в себя все основные поля и методы для работы с пользователями.from django.contrib.auth.models import User
# Создание нового пользователя
user = User.objects.create_user(username='john', password='password123')
# Аутентификация пользователя
from django.contrib.auth import authenticate, login
user = authenticate(username='john', password='password123')
if user is not None:
login(request, user)
from django.db import models
from django.contrib.auth.models import User
class UserProfile(models.Model):
user = models.OneToOneField(User, on_delete=models.CASCADE)
bio = models.TextField(blank=True)
birth_date = models.DateField(null=True, blank=True)
# Сигналы для автоматического создания и сохранения профиля пользователя
from django.db.models.signals import post_save
from django.dispatch import receiver
@receiver(post_save, sender=User)
def create_user_profile(sender, instance, created, **kwargs):
if created:
UserProfile.objects.create(user=instance)
@receiver(post_save, sender=User)
def save_user_profile(sender, instance, **kwargs):
instance.userprofile.save()
# Получение и изменение профиля пользователя
user = User.objects.get(username='john')
profile = user.userprofile
profile.bio = "Hello, I'm John!"
profile.save()
from django.contrib.auth.models import AbstractBaseUser, BaseUserManager
from django.db import models
class CustomUserManager(BaseUserManager):
def create_user(self, email, password=None, **extra_fields):
if not email:
raise ValueError('The Email field must be set')
email = self.normalize_email(email)
user = self.model(email=email, **extra_fields)
user.set_password(password)
user.save(using=self._db)
return user
def create_superuser(self, email, password=None, **extra_fields):
extra_fields.setdefault('is_staff', True)
extra_fields.setdefault('is_superuser', True)
return self.create_user(email, password, **extra_fields)
class CustomUser(AbstractBaseUser):
email = models.EmailField(unique=True)
first_name = models.CharField(max_length=30, blank=True)
last_name = models.CharField(max_length=30, blank=True)
is_active = models.BooleanField(default=True)
is_staff = models.BooleanField(default=False)
objects = CustomUserManager()
USERNAME_FIELD = 'email'
REQUIRED_FIELDS = ['first_name', 'last_name']
def __str__(self):
return self.email
29 Dec, 16:10
29 Dec, 09:10
IntegerChoices
в Django используется для создания выбора из ограниченного набора целочисленных значений для поля модели. Это полезно, когда вам нужно ограничить допустимые значения для поля модели определенными целыми числами, и при этом иметь удобные человекочитаемые названия для этих значений.IntegerChoices
from django.db import models
class Status(models.IntegerChoices):
PENDING = 1, 'Pending'
APPROVED = 2, 'Approved'
REJECTED = 3, 'Rejected'
IntegerChoices
в моделиfrom django.db import models
class Application(models.Model):
status = models.IntegerField(choices=Status.choices, default=Status.PENDING)
name = models.CharField(max_length=100)
submitted_at = models.DateTimeField(auto_now_add=True)
def __str__(self):
return f"{self.name} - {self.get_status_display()}"
# Создание новой записи
app = Application.objects.create(name='John Doe')
# Проверка статуса
print(app.status) # 1
print(app.get_status_display()) # 'Pending'
# Изменение статуса
app.status = Status.APPROVED
app.save()
# Проверка обновленного статуса
print(app.status) # 2
print(app.get_status_display()) # 'Approved'
from django.db import models
class Status(models.IntegerChoices):
PENDING = 1, 'Pending'
APPROVED = 2, 'Approved'
REJECTED = 3, 'Rejected'
@classmethod
def get_choices(cls):
return [(choice.value, choice.label) for choice in cls]
# Пример использования
print(Status.get_choices()) # [(1, 'Pending'), (2, 'Approved'), (3, 'Rejected')]
# Фильтрация записей по статусу
pending_apps = Application.objects.filter(status=Status.PENDING)
for app in pending_apps:
print(app.name)
# Фильтрация записей по множеству статусов
approved_or_rejected_apps = Application.objects.filter(status__in=[Status.APPROVED, Status.REJECTED])
for app in approved_or_rejected_apps:
print(app.name)
28 Dec, 16:10
28 Dec, 09:10
{}
. Ключи должны быть строками, а значения могут быть различными типами данных.[]
.{
"name": "John Doe",
"age": 30,
"isStudent": false,
"courses": ["Math", "Science", "History"],
"address": {
"street": "123 Main St",
"city": "Anytown",
"zip": "12345"
}
}
"name": "John Doe"
"age": 30
true
или false
. "isStudent": false
"courses": ["Math", "Science", "History"]
"address": {
"street": "123 Main St",
"city": "Anytown",
"zip": "12345"
}
"middleName": null
import json
data = {
"name": "John Doe",
"age": 30,
"isStudent": False,
"courses": ["Math", "Science", "History"],
"address": {
"street": "123 Main St",
"city": "Anytown",
"zip": "12345"
}
}
# Преобразование Python объекта в JSON строку
json_string = json.dumps(data, indent=4)
print(json_string)
import json
json_string = '''
{
"name": "John Doe",
"age": 30,
"isStudent": false,
"courses": ["Math", "Science", "History"],
"address": {
"street": "123 Main St",
"city": "Anytown",
"zip": "12345"
}
}
'''
# Преобразование JSON строки в Python объект
data = json.loads(json_string)
print(data)
print(data['name']) # John Doe
import json
data = {
"name": "John Doe",
"age": 30,
"isStudent": False,
"courses": ["Math", "Science", "History"],
"address": {
"street": "123 Main St",
"city": "Anytown",
"zip": "12345"
}
}
with open('data.json', 'w') as file:
json.dump(data, file, indent=4)
import json
with open('data.json', 'r') as file:
data = json.load(file)
print(data)
print(data['name']) # John Doe
27 Dec, 16:10
27 Dec, 09:10
type()
можно узнать тип любого объекта. x = 10
print(type(x)) # <class 'int'>
hasattr()
, getattr()
и setattr()
позволяют проверять и манипулировать атрибутами объектов. class MyClass:
def __init__(self, value):
self.value = value
obj = MyClass(5)
# Проверка наличия атрибута
print(hasattr(obj, 'value')) # True
# Получение значения атрибута
print(getattr(obj, 'value')) # 5
# Установка значения атрибута
setattr(obj, 'value', 10)
print(getattr(obj, 'value')) # 10
inspect
предоставляет функции для получения информации о классах, методах и функциях. import inspect
class MyClass:
def method(self):
pass
# Получение всех методов класса
methods = inspect.getmembers(MyClass, predicate=inspect.isfunction)
print(methods) # [('method', <function MyClass.method at 0x...>)]
dir()
возвращает список всех атрибутов и методов объекта. class MyClass:
def method(self):
pass
obj = MyClass()
print(dir(obj))
# ['__class__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__',
# '__gt__', '__hash__', '__init__', '__init_subclass__', '__le__', '__lt__', '__module__', '__ne__', '__new__', '__reduce__',
# '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__', 'method']
inspect
предоставляет функции для получения информации о живых объектах, включая функции, методы, классы и модули. import inspect
def my_function():
pass
# Получение информации о функции
print(inspect.getmembers(my_function))
26 Dec, 16:10
26 Dec, 09:10
25 Dec, 09:10
id = models.AutoField(primary_key=True)
name = models.CharField(max_length=100)
description = models.TextField()
age = models.IntegerField()
price = models.FloatField()
is_active = models.BooleanField(default=True)
created_at = models.DateTimeField(auto_now_add=True)
author = models.ForeignKey('Author', on_delete=models.CASCADE)
categories = models.ManyToManyField('Category')
profile = models.OneToOneField('Profile', on_delete=models.CASCADE)
24 Dec, 16:10
24 Dec, 09:10
Manager
), чтобы добавить дополнительные методы для выполнения более сложных запросов к базе данных. Менеджеры используются для работы с наборами запросов (QuerySets) и предоставляют интерфейс для выполнения операций с базой данных.from django.db import models
from django.utils import timezone
class BookManager(models.Manager):
def by_author(self, author_name):
return self.filter(author__name=author_name)
def published_recently(self):
one_month_ago = timezone.now() - timezone.timedelta(days=30)
return self.filter(publication_date__gte=one_month_ago)
from django.db import models
class Author(models.Model):
name = models.CharField(max_length=100)
class Book(models.Model):
title = models.CharField(max_length=200)
author = models.ForeignKey(Author, on_delete=models.CASCADE)
publication_date = models.DateTimeField()
# Подключение кастомного менеджера
objects = BookManager()
# Получение книг по автору
books_by_author = Book.objects.by_author('John Doe')
for book in books_by_author:
print(book.title)
# Получение книг, опубликованных за последний месяц
recent_books = Book.objects.published_recently()
for book in recent_books:
print(book.title)
23 Dec, 16:10
23 Dec, 09:10
22 Dec, 16:10
22 Dec, 09:10
class User:
def __init__(self, name, email):
self.name = name
self.email = email
def save(self):
# Сохранение данных пользователя в базу данных
print(f"Saving user {self.name} to the database.")
def send_welcome_email(self):
# Отправка приветственного сообщения на электронную почту
print(f"Sending welcome email to {self.email}.")
User
на два отдельных класса: один для управления данными пользователя, другой для отправки сообщений электронной почты.class User:
def __init__(self, name, email):
self.name = name
self.email = email
class UserRepository:
def save(self, user):
# Сохранение данных пользователя в базу данных
print(f"Saving user {user.name} to the database.")
class EmailService:
def send_welcome_email(self, user):
# Отправка приветственного сообщения на электронную почту
print(f"Sending welcome email to {user.email}.")
# Использование классов
user = User("Alice", "[email protected]")
user_repository = UserRepository()
email_service = EmailService()
user_repository.save(user)
email_service.send_welcome_email(user)
21 Dec, 16:10
21 Dec, 09:10
npx create-next-app@latest my-isomorphic-app
cd my-isomorphic-app
npm run dev
// pages/index.js
import React from 'react';
const Home = ({ message }) => (
<div>
<h1>{message}</h1>
</div>
);
export async function getServerSideProps() {
return {
props: {
message: 'Hello from the server!',
},
};
}
export default Home;
20 Dec, 09:10
19 Dec, 16:10
19 Dec, 09:10
class Animal:
def speak(self):
return "Some sound"
class Dog(Animal):
def speak(self):
return "Woof!"
dog = Dog()
print(dog.speak()) # Woof!
class Animal:
def eat(self):
return "Eating"
class Pet:
def play(self):
return "Playing"
class Dog(Animal, Pet):
def speak(self):
return "Woof!"
dog = Dog()
print(dog.eat()) # Eating
print(dog.play()) # Playing
print(dog.speak()) # Woof!
class Animal:
def eat(self):
return "Eating"
class Mammal(Animal):
def walk(self):
return "Walking"
class Dog(Mammal):
def speak(self):
return "Woof!"
dog = Dog()
print(dog.eat()) # Eating
print(dog.walk()) # Walking
print(dog.speak()) # Woof!
class Animal:
def speak(self):
return "Some sound"
class Dog(Animal):
def speak(self):
return "Woof!"
class Cat(Animal):
def speak(self):
return "Meow!"
dog = Dog()
cat = Cat()
print(dog.speak()) # Woof!
print(cat.speak()) # Meow!
class Animal:
def eat(self):
return "Eating"
class Mammal(Animal):
def walk(self):
return "Walking"
class Bird(Animal):
def fly(self):
return "Flying"
class Bat(Mammal, Bird):
def use_sonar(self):
return "Using sonar"
bat = Bat()
print(bat.eat()) # Eating
print(bat.walk()) # Walking
print(bat.fly()) # Flying
print(bat.use_sonar()) # Using sonar
18 Dec, 16:10
18 Dec, 09:10
abc
(Abstract Base Classes).ABC
.@abstractmethod
.from abc import ABC, abstractmethod
# Создание абстрактного класса
class Animal(ABC):
@abstractmethod
def make_sound(self):
pass
# Попытка создания экземпляра абстрактного класса приведет к ошибке
# animal = Animal() # TypeError: Can't instantiate abstract class Animal with abstract methods make_sound
# Создание подклассов, которые реализуют абстрактные методы
class Dog(Animal):
def make_sound(self):
return "Woof!"
class Cat(Animal):
def make_sound(self):
return "Meow!"
# Теперь можно создать экземпляры подклассов
dog = Dog()
print(dog.make_sound()) # Woof!
cat = Cat()
print(cat.make_sound()) # Meow!
17 Dec, 16:10
17 Dec, 09:10
type
.class MyClass:
pass
# Проверка типа класса
print(type(MyClass)) # <class 'type'>
def create_class(name):
if name == "Dog":
class Dog:
def speak(self):
return "Woof!"
return Dog
else:
class Cat:
def speak(self):
return "Meow!"
return Cat
AnimalClass = create_class("Dog")
animal = AnimalClass()
print(animal.speak()) # Woof!
def print_class_name(cls):
print(cls.__name__)
class MyClass:
pass
print_class_name(MyClass) # MyClass
type
.class MyMeta(type):
def __new__(cls, name, bases, dct):
print(f"Creating class {name}")
return super().__new__(cls, name, bases, dct)
class MyClass(metaclass=MyMeta):
pass
# Вывод: Creating class MyClass
26 Nov, 12:54
26 Nov, 09:10
import time
# Оригинальная функция
def original_sleep(seconds):
time.sleep(seconds)
print(f"Slept for {seconds} seconds")
# Monkey patching функции sleep
def patched_sleep(seconds):
print(f"Patched! Should have slept for {seconds} seconds")
# Применение monkey patching
time.sleep = patched_sleep
# Примеры использования
time.sleep(3) # Вывод: Patched! Should have slept for 3 seconds
25 Nov, 16:10
25 Nov, 09:10
with
является рекомендованным способом гарантированного закрытия файла, так как он автоматически управляет открытием и закрытием ресурса. Однако, если по какой-то причине вы не можете использовать with
, можно гарантировать закрытие файла другими способами, такими как использование явного вызова метода close()
в блоке finally
.try-finally
гарантирует, что файл будет закрыт, даже если в блоке try
произойдет исключение. В этом примере файл открывается в блоке try
, и его содержимое читается. Независимо от того, происходит ли исключение в блоке try
или нет, блок finally
будет выполнен, и файл будет закрыт.file = None
try:
file = open('example.txt', 'r')
content = file.read()
print(content)
finally:
if file:
file.close()
class FileManager:
def __init__(self, filename, mode):
self.filename = filename
self.mode = mode
self.file = None
def __enter__(self):
self.file = open(self.filename, self.mode)
return self.file
def __exit__(self, exc_type, exc_value, traceback):
if self.file:
self.file.close()
# Примеры использования
file_manager = FileManager('example.txt', 'r')
try:
file = file_manager.__enter__()
content = file.read()
print(content)
finally:
file_manager.__exit__(None, None, None)
from functools import wraps
def open_file(filename, mode):
def decorator(func):
@wraps(func)
def wrapper(*args, **kwargs):
file = open(filename, mode)
try:
result = func(file, *args, **kwargs)
finally:
file.close()
return result
return wrapper
return decorator
@open_file('example.txt', 'r')
def read_file(f):
return f.read()
# Примеры использования
print(read_file())
contextlib
предоставляет полезные утилиты для создания контекстных менеджеров. Одной из таких утилит является contextlib.contextmanager
, которая позволяет создавать контекстные менеджеры с помощью генераторов.from contextlib import contextmanager
@contextmanager
def open_file(filename, mode):
file = open(filename, mode)
try:
yield file
finally:
file.close()
# Примеры использования
file_manager = open_file('example.txt', 'r')
file = file_manager.__enter__()
try:
content = file.read()
print(content)
finally:
file_manager.__exit__(None, None, None)
24 Nov, 16:10
24 Nov, 09:10
property
, которая упрощает создание геттеров и сеттеров, делая код более читабельным и идиоматичным.property
class MyClass:
def __init__(self, value):
self._value = value # Приватный атрибут
def get_value(self):
return self._value
def set_value(self, value):
if value >= 0:
self._value = value
else:
raise ValueError("Value must be non-negative")
# Примеры использования
obj = MyClass(10)
print(obj.get_value()) # Вывод: 10
obj.set_value(20)
print(obj.get_value()) # Вывод: 20
try:
obj.set_value(-10) # Пример вызова исключения
except ValueError as e:
print(e) # Вывод: Value must be non-negative
property
, чтобы избежать явных вызовов геттеров и сеттеров и сделать код более естественным и читаемым. property
позволяет определить методы доступа как атрибуты.property
class MyClass:
def __init__(self, value):
self._value = value
@property
def value(self):
return self._value
@value.setter
def value(self, value):
if value >= 0:
self._value = value
else:
raise ValueError("Value must be non-negative")
# Примеры использования
obj = MyClass(10)
print(obj.value) # Вывод: 10 (используется геттер)
obj.value = 20
print(obj.value) # Вывод: 20 (используется сеттер)
try:
obj.value = -10 # Пример вызова исключения через сеттер
except ValueError as e:
print(e) # Вывод: Value must be non-negative
@property
для создания делетера (удаления атрибута).class MyClass:
def __init__(self, value):
self._value = value
@property
def value(self):
return self._value
@value.setter
def value(self, value):
if value >= 0:
self._value = value
else:
raise ValueError("Value must be non-negative")
@value.deleter
def value(self):
del self._value
# Примеры использования
obj = MyClass(10)
print(obj.value) # Вывод: 10
obj.value = 20
print(obj.value) # Вывод: 20
del obj.value
try:
print(obj.value) # Ошибка, так как атрибут удален
except AttributeError as e:
print(e) # Вывод: 'MyClass' object has no attribute '_value'
23 Nov, 16:10
23 Nov, 09:10
class MyClass:
class_attribute = 42 # Атрибут класса
# Доступ к атрибуту класса
print(MyClass.class_attribute) # Вывод: 42
# Создание экземпляров
obj1 = MyClass()
obj2 = MyClass()
# Доступ к атрибуту класса через экземпляры
print(obj1.class_attribute) # Вывод: 42
print(obj2.class_attribute) # Вывод: 42
# Изменение атрибута класса
MyClass.class_attribute = 100
print(obj1.class_attribute) # Вывод: 100
print(obj2.class_attribute) # Вывод: 100
__init__
, и относятся к конкретному экземпляру.class MyClass:
def __init__(self, value):
self.instance_attribute = value # Атрибут объекта
# Создание экземпляров
obj1 = MyClass(10)
obj2 = MyClass(20)
# Доступ к атрибутам объекта
print(obj1.instance_attribute) # Вывод: 10
print(obj2.instance_attribute) # Вывод: 20
# Изменение атрибутов объекта
obj1.instance_attribute = 15
print(obj1.instance_attribute) # Вывод: 15
print(obj2.instance_attribute) # Вывод: 20
__init__
и уникальны для каждого экземпляра.class MyClass:
class_attribute = 'class value'
def __init__(self, value):
self.instance_attribute = value
# Создание экземпляров
obj1 = MyClass('instance value 1')
obj2 = MyClass('instance value 2')
# Доступ к атрибутам класса и объекта
print(MyClass.class_attribute) # Вывод: class value
print(obj1.class_attribute) # Вывод: class value
print(obj2.class_attribute) # Вывод: class value
print(obj1.instance_attribute) # Вывод: instance value 1
print(obj2.instance_attribute) # Вывод: instance value 2
# Изменение атрибута класса через класс
MyClass.class_attribute = 'new class value'
print(obj1.class_attribute) # Вывод: new class value
print(obj2.class_attribute) # Вывод: new class value
# Изменение атрибута объекта
obj1.instance_attribute = 'new instance value 1'
print(obj1.instance_attribute) # Вывод: new instance value 1
print(obj2.instance_attribute) # Вывод: instance value 2
22 Nov, 16:10
22 Nov, 09:10
dataclasses
, который автоматически генерирует специальные методы, такие как __init__
, __repr__
, __eq__
, и другие, для вашего класса. Это упрощает создание классов, предназначенных для хранения данных, устраняя необходимость писать много шаблонного кода.dataclasses
и применить к классу. Внутри класса достаточно определить только поля данных.from dataclasses import dataclass
@dataclass
class Person:
name: str
age: int
# Примеры использования
person1 = Person(name="Alice", age=30)
person2 = Person(name="Bob", age=25)
print(person1) # Вывод: Person(name='Alice', age=30)
print(person2) # Вывод: Person(name='Bob', age=25)
print(person1 == person2) # Вывод: False
@dataclass
с помощью параметров, таких как order
, frozen
, и других.from dataclasses import dataclass
@dataclass(order=True, frozen=True)
class Person:
name: str
age: int
person1 = Person(name="Alice", age=30)
person2 = Person(name="Bob", age=25)
print(person1 > person2) # Вывод: True (поскольку 'Alice' > 'Bob' по алфавиту, если имена равны, сравниваются возраста)
# person1.age = 31 # Ошибка: FrozenInstanceError (поскольку класс заморожен)
field()
для настройки отдельных полей, например, для указания значений по умолчанию или исключения полей из методов __repr__
, __eq__
, и других.from dataclasses import dataclass, field
@dataclass
class Person:
name: str
age: int = 0
address: str = field(default="Unknown", repr=False)
person = Person(name="Alice")
print(person) # Вывод: Person(name='Alice', age=0)
21 Nov, 16:10
21 Nov, 09:10
@staticmethod
перед определением метода. В отличие от обычных методов класса, статический метод не принимает параметр self
.class MathUtils:
@staticmethod
def add(a, b):
return a + b
@staticmethod
def multiply(a, b):
return a * b
# Вызов статических методов
print(MathUtils.add(5, 3)) # Вывод: 8
print(MathUtils.multiply(5, 3)) # Вывод: 15
is_valid_email
проверяет, является ли строка допустимым email адресом. Поскольку этот метод не требует доступа к состоянию экземпляра класса, его логично сделать статическим.class Validator:
@staticmethod
def is_valid_email(email):
return "@" in email and "." in email
# Вызов статического метода
print(Validator.is_valid_email("[email protected]")) # Вывод: True
print(Validator.is_valid_email("invalid-email")) # Вывод: False
self
, который указывает на текущий экземпляр класса.cls
, который указывает на сам класс, и могут изменять состояние класса.self
, ни cls
, что делает их более похожими на обычные функции, но логически сгруппированными в классе.class Example:
def instance_method(self):
print("This is an instance method")
@classmethod
def class_method(cls):
print("This is a class method")
@staticmethod
def static_method():
print("This is a static method")
# Создание экземпляра класса
obj = Example()
# Вызов методов
obj.instance_method() # Вывод: This is an instance method
Example.class_method() # Вывод: This is a class method
Example.static_method() # Вывод: This is a static method
20 Nov, 19:29
20 Nov, 16:10
20 Nov, 09:10
with
. Это полезно для автоматического управления ресурсами, такими как открытие и закрытие файлов, управление соединениями с базами данных и т. д.with
. Этот метод должен возвращать объект, который будет связан с переменной после оператора as
.with
, даже если в блоке произошло исключение. Он принимает три аргумента: тип исключения, значение исключения и трассировку (traceback). Если исключение не произошло, все три аргумента будут равны None
.class FileManager:
def __init__(self, filename, mode):
self.filename = filename
self.mode = mode
self.file = None
def __enter__(self):
self.file = open(self.filename, self.mode)
return self.file
def __exit__(self, exc_type, exc_value, traceback):
if self.file:
self.file.close()
# Примеры использования
with FileManager('example.txt', 'w') as f:
f.write('Hello, World!')
# Пример с обработкой исключений
try:
with FileManager('example.txt', 'r') as f:
content = f.read()
print(content)
except Exception as e:
print(f"An error occurred: {e}")
class DatabaseConnection:
def __init__(self, db_name):
self.db_name = db_name
self.connection = None
def __enter__(self):
self.connection = self.connect_to_database(self.db_name)
return self.connection
def __exit__(self, exc_type, exc_value, traceback):
if self.connection:
self.connection.close()
def connect_to_database(self, db_name):
# Реализация соединения с базой данных (псевдокод)
print(f"Connecting to database {db_name}")
return f"Connection to {db_name}"
def close(self):
# Реализация закрытия соединения (псевдокод)
print("Closing the connection")
# Примеры использования
with DatabaseConnection('my_database') as conn:
print(conn)
# Выполнение операций с базой данных
# Пример с обработкой исключений
try:
with DatabaseConnection('my_database') as conn:
raise ValueError("Some error occurred")
except Exception as e:
print(f"An error occurred: {e}")
19 Nov, 16:10
19 Nov, 09:10
class MyList:
def __init__(self, items):
self.items = items
def __getitem__(self, index):
return self.items[index]
# Примеры использования
my_list = MyList([1, 2, 3, 4])
print(my_list[0]) # Вывод: 1
print(my_list[2]) # Вывод: 3
class MyList:
def __init__(self, items):
self.items = items
def __setitem__(self, index, value):
self.items[index] = value
# Примеры использования
my_list = MyList([1, 2, 3, 4])
my_list[1] = 10
print(my_list.items) # Вывод: [1, 10, 3, 4]
del
с квадратными скобками.class MyList:
def __init__(self, items):
self.items = items
def __delitem__(self, index):
del self.items[index]
# Примеры использования
my_list = MyList([1, 2, 3, 4])
del my_list[2]
print(my_list.items) # Вывод: [1, 2, 4]
class CustomDict:
def __init__(self):
self.data = {}
def __getitem__(self, key):
return self.data[key]
def __setitem__(self, key, value):
self.data[key] = value
def __delitem__(self, key):
del self.data[key]
# Примеры использования
custom_dict = CustomDict()
custom_dict['a'] = 1
custom_dict['b'] = 2
print(custom_dict['a']) # Вывод: 1
print(custom_dict['b']) # Вывод: 2
del custom_dict['a']
print(custom_dict.data) # Вывод: {'b': 2}
18 Nov, 16:10
18 Nov, 09:10
__call__
, нужно его определить в своем классе. Этот метод может принимать любые аргументы, как и обычные функции.class Counter:
def __init__(self):
self.count = 0
def __call__(self):
self.count += 1
print(f"Count is now {self.count}")
# Примеры использования
counter = Counter()
counter() # Вывод: Count is now 1
counter() # Вывод: Count is now 2
counter() # Вывод: Count is now 3
class Adder:
def __init__(self, value):
self.value = value
def __call__(self, x):
return self.value + x
# Примеры использования
add5 = Adder(5)
print(add5(10)) # Вывод: 15
print(add5(20)) # Вывод: 25
class Polynomial:
def __init__(self, coefficients):
self.coefficients = coefficients
def __call__(self, x):
result = 0
for power, coef in enumerate(self.coefficients):
result += coef * (x ** power)
return result
# Примеры использования
p = Polynomial([1, 0, 2]) # Создает полином 1 + 0x + 2x^2
print(p(2)) # Вывод: 9 (1 + 0*2 + 2*2^2)
print(p(3)) # Вывод: 19 (1 + 0*3 + 2*3^2)
17 Nov, 16:10
17 Nov, 09:10
==
. Он позволяет определить, когда два объекта вашего класса считаются равными.class Person:
def __init__(self, name, age):
self.name = name
self.age = age
def __eq__(self, other):
return self.name == other.name and self.age == other.age
p1 = Person("Alice", 30)
p2 = Person("Alice", 30)
p3 = Person("Bob", 25)
print(p1 == p2) # Вывод: True
print(p1 == p3) # Вывод: False
!=
. Он позволяет определить, когда два объекта вашего класса считаются неравными.class Person:
def __init__(self, name, age):
self.name = name
self.age = age
def __ne__ (self, other):
return self.name != other.name or self.age != other.age
p1 = Person("Alice", 30)
p2 = Person("Alice", 30)
p3 = Person("Bob", 25)
print(p1 != p2) # Вывод: False
print(p1 != p3) # Вывод: True
<
. Он позволяет определить, когда один объект вашего класса считается меньше другого.class Person:
def __init__(self, name, age):
self.name = name
self.age = age
def __lt__(self, other):
return self.age < other.age
p1 = Person("Alice", 30)
p2 = Person("Bob", 25)
print(p1 < p2) # Вывод: False
print(p2 < p1) # Вывод: True
<=
. Он позволяет определить, когда один объект вашего класса считается меньше или равен другому.class Person:
def __init__(self, name, age):
self.name = name
self.age = age
def __le__(self, other):
return self.age <= other.age
p1 = Person("Alice", 30)
p2 = Person("Bob", 30)
p3 = Person("Charlie", 25)
print(p1 <= p2) # Вывод: True
print(p1 <= p3) # Вывод: False
>
. Он позволяет определить, когда один объект вашего класса считается больше другого.class Person:
def __init__(self, name, age):
self.name = name
self.age = age
def __gt__(self, other):
return self.age > other.age
p1 = Person("Alice", 30)
p2 = Person("Bob", 25)
print(p1 > p2) # Вывод: True
print(p2 > p1) # Вывод: False
>=
. Он позволяет определить, когда один объект вашего класса считается больше или равен другому.class Person:
def __init__(self, name, age):
self.name = name
self.age = age
def __ge__(self, other):
return self.age >= other.age
p1 = Person("Alice", 30)
p2 = Person("Bob", 30)
p3 = Person("Charlie", 25)
print(p1 >= p2) # Вывод: True
print(p1 >= p3) # Вывод: True
print(p3 >= p1) # Вывод: False
16 Nov, 16:10
16 Nov, 09:10
bool()
на объекте или объект используется в контексте, где требуется логическое значение (например, в условиях if), вызывается метод __bool__
. Если метод __bool__
не определен, Python использует метод __len__
: объект считается ложным (False), если его длина равна нулю, и истинным (True) в противном случае.__bool__
позволяет вам определять, что будет считаться истинным или ложным для объектов вашего класса. Это может быть полезно в различных ситуациях, например, для проверки пустых контейнеров, валидных состояний объектов и т.д.__bool__
, нужно его определить в своем классе. Метод должен возвращать либо True
, либо False
. В этом примере метод __bool__
проверяет значение атрибута value
. Если value
имеет значение, которое считается ложным (например, 0 или None), метод возвращает False
. В противном случае, он возвращает True
.class MyClass:
def __init__(self, value):
self.value = value
def __bool__(self):
return bool(self.value)
# Примеры использования
obj1 = MyClass(0)
obj2 = MyClass(10)
print(bool(obj1)) # Вывод: False
print(bool(obj2)) # Вывод: True
if obj1:
print("obj1 is True")
else:
print("obj1 is False") # Этот блок выполнится
if obj2:
print("obj2 is True") # Этот блок выполнится
else:
print("obj2 is False")
Box
, который содержит предметы, и вы хотите, чтобы пустая коробка считалась ложной, а коробка с предметами — истинной.class Box:
def __init__(self, items):
self.items = items
def __bool__(self):
return bool(self.items)
# Примеры использования
empty_box = Box([])
full_box = Box(['item1', 'item2'])
print(bool(empty_box)) # Вывод: False
print(bool(full_box)) # Вывод: True
if empty_box:
print("The box is not empty")
else:
print("The box is empty") # Этот блок выполнится
if full_box:
print("The box is not empty") # Этот блок выполнится
else:
print("The box is empty")
15 Nov, 16:10
15 Nov, 09:10
class Vector:
def __init__(self, x, y):
self.x = x
self.y = y
def __add__(self, other):
return Vector(self.x + other.x, self.y + other.y)
def __repr__(self):
return f"Vector({self.x}, {self.y})"
v1 = Vector(1, 2)
v2 = Vector(3, 4)
print(v1 + v2) # Вывод: Vector(4, 6)
class Vector:
def __init__(self, x, y):
self.x = x
self.y = y
def __mul__(self, scalar):
return Vector(self.x * scalar, self.y * scalar)
def __repr__(self):
return f"Vector({self.x}, {self.y})"
v = Vector(1, 2)
print(v * 3) # Вывод: Vector(3, 6)
class Vector:
def __init__(self, x, y):
self.x = x
self.y = y
def __sub__(self, other):
return Vector(self.x - other.x, self.y - other.y)
def __repr__(self):
return f"Vector({self.x}, {self.y})"
v1 = Vector(5, 7)
v2 = Vector(2, 3)
print(v1 - v2) # Вывод: Vector(3, 4)
class Vector:
def __init__(self, x, y):
self.x = x
self.y = y
def __truediv__(self, scalar):
return Vector(self.x / scalar, self.y / scalar)
def __repr__(self):
return f"Vector({self.x}, {self.y})"
v = Vector(8, 4)
print(v / 2) # Вывод: Vector(4.0, 2.0)
14 Nov, 16:10
14 Nov, 09:10
Mock
from unittest.mock import Mock
# Создание мок-объекта
mock = Mock()
# Настройка мок-объекта
mock.some_method.return_value = "Mocked Result"
# Вызов метода и проверка результата
result = mock.some_method()
print(result) # Вывод: Mocked Result
patch
для замены объектовimport unittest
from unittest.mock import patch
# Пример функции, которая вызывает внешний API
def fetch_data():
import requests
response = requests.get("http://example.com/api/data")
return response.json()
# Тестирование функции с использованием patch
class TestFetchData(unittest.TestCase):
@patch('requests.get')
def test_fetch_data(self, mock_get):
# Настройка мок-ответа
mock_get.return_value.json.return_value = {"key": "value"}
# Вызов тестируемой функции
result = fetch_data()
# Проверка результата
self.assertEqual(result, {"key": "value"})
mock_get.assert_called_once_with("http://example.com/api/data")
if __name__ == '__main__':
unittest.main()
MagicMock
from unittest.mock import MagicMock
# Создание объекта MagicMock
mock = MagicMock()
# Настройка возвращаемого значения для магического метода __str__
mock.__str__.return_value = "MagicMocked String"
print(str(mock)) # Вывод: MagicMocked String
13 Nov, 16:10
13 Nov, 09:10
def add(a, b):
return a + b
import unittest
from my_module import add # Импортируем тестируемую функцию из модуля
class TestAddFunction(unittest.TestCase):
def test_add_positive_numbers(self):
self.assertEqual(add(2, 3), 5)
def test_add_negative_numbers(self):
self.assertEqual(add(-1, -1), -2)
def test_add_zero(self):
self.assertEqual(add(0, 0), 0)
if __name__ == '__main__':
unittest.main()
python test_add.py
12 Nov, 16:10
12 Nov, 09:10
class Dog:
def bark(self):
return "Woof!"
# Оригинальное поведение
dog = Dog()
print(dog.bark()) # Вывод: Woof!
# Применение monkey patch
def new_bark(self):
return "Woof! Woof!"
Dog.bark = new_bark
# Измененное поведение
print(dog.bark()) # Вывод: Woof! Woof!
math_operations.py
с функцией, содержащей ошибку:# math_operations.py
def add(a, b):
return a - b # Ошибка: должно быть сложение, а не вычитание
import math_operations
def corrected_add(a, b):
return a + b
# Применение monkey patch
math_operations.add = corrected_add
# Теперь функция add работает правильно
print(math_operations.add(2, 3)) # Вывод: 5
class Cat:
def meow(self):
return "Meow!"
# Оригинальное поведение
cat = Cat()
print(cat.meow()) # Вывод: Meow!
# Применение monkey patch
def purr(self):
return "Purr..."
Cat.purr = purr
# Расширенное поведение
print(cat.purr()) # Вывод: Purr...
12 Nov, 07:00
11 Nov, 16:10
11 Nov, 09:10
open()
, которая возвращает объект файла. open()
принимает два основных аргумента:'r'
: Открытие для чтения (по умолчанию).'w'
: Открытие для записи (содержимое файла удаляется).'a'
: Открытие для добавления (данные добавляются в конец файла).'b'
: Бинарный режим (например, 'rb'
или 'wb'
).'+'
: Открытие для чтения и записи (например, 'r+'
или 'w+'
).file = open('example.txt', 'r')
read()
, readline()
и readlines()
.with open('example.txt', 'r') as file:
content = file.read()
print(content)
with open('example.txt', 'r') as file:
for line in file:
print(line.strip())
write()
и writelines()
.with open('example.txt', 'w') as file:
file.write('Hello, World!')
with open('example.txt', 'a') as file:
file.write('\nAppend this line')
close()
, но лучше использовать конструкцию with
, которая автоматически закрывает файл:with open('example.txt', 'r') as file:
content = file.read()
# Файл автоматически закроется по завершении блока with
# Открытие файла для записи
with open('example.txt', 'w') as file:
file.write('This is the first line.\n')
file.write('This is the second line.\n')
# Открытие файла для добавления
with open('example.txt', 'a') as file:
file.write('This line is added to the end of the file.\n')
# Открытие файла для чтения
with open('example.txt', 'r') as file:
for line in file:
print(line.strip())
'b'
. Например, чтение и запись изображений или других бинарных данных# Чтение бинарного файла
with open('image.png', 'rb') as file:
data = file.read()
# Запись в бинарный файл
with open('copy_image.png', 'wb') as file:
file.write(data)
try except
:try:
with open('example.txt', 'r') as file:
content = file.read()
except FileNotFoundError:
print("File not found.")
except IOError:
print("An error occurred while reading the file.")
10 Nov, 16:10
10 Nov, 09:10
try
блок: Содержит код, который потенциально может вызвать исключение.except
блок: Содержит код, который выполняется, если в блоке try возникает исключение.try:
# Код, который может вызвать исключение
...
except SomeException as e:
# Код, который выполняется в случае возникновения исключения SomeException
...
try:
result = 10 / 0
except ZeroDivisionError as e:
print(f"Error occurred: {e}")
"abc"
невозможно преобразовать в целое число, будет вызвано исключение ValueError
, и соответствующее сообщение будет выведено.try:
result = int("abc")
except ZeroDivisionError:
print("Attempted to divide by zero")
except ValueError:
print("Invalid value")
except Exception as e:
print(f"An unexpected error occurred: {e}")
try
не возникло исключений. try:
file = open('example.txt', 'r')
content = file.read()
except FileNotFoundError:
print("File not found")
else:
print("File read successfully")
finally:
file.close()
print("File closed")
finally
try:
file = open('example.txt', 'r')
content = file.read()
except FileNotFoundError:
print("File not found")
else:
print("File read successfully")
finally:
try:
file.close()
print("File closed")
except NameError:
print("File was never opened")
10 Nov, 07:10
09 Nov, 16:10
09 Nov, 09:10
self
(ссылку на экземпляр), методы класса принимают cls
(ссылку на класс).class MyClass:
class_attribute = "Hello, World!"
def __init__(self, value):
self.instance_attribute = value
@classmethod
def class_method(cls):
return cls.class_attribute
# Создание экземпляра класса
obj = MyClass("Some value")
# Вызов метода класса через класс
print(MyClass.class_method()) # Hello, World!
# Вызов метода класса через экземпляр
print(obj.class_method()) # Hello, World!
class Person:
def __init__(self, name, age):
self.name = name
self.age = age
@classmethod
def from_birth_year(cls, name, birth_year):
current_year = 2023
age = current_year - birth_year
return cls(name, age)
# Создание объекта через основной конструктор
person1 = Person("Alice", 30)
# Создание объекта через фабричный метод
person2 = Person.from_birth_year("Bob", 1990)
print(person1.name, person1.age) # Alice 30
print(person2.name, person2.age) # Bob 33
class Example:
class_attr = "class attribute"
def __init__(self, value):
self.instance_attr = value
def instance_method(self):
return f"instance method: {self.instance_attr}"
@classmethod
def class_method(cls):
return f"class method: {cls.class_attr}"
@staticmethod
def static_method():
return "static method"
# Создание экземпляра класса
example = Example("instance attribute")
# Вызов методов
print(example.instance_method()) # instance method: instance attribute
print(Example.class_method()) # class method: class attribute
print(example.class_method()) # class method: class attribute
print(Example.static_method()) # static method
print(example.static_method()) # static method
08 Nov, 16:10
08 Nov, 09:10
class Animal:
def speak(self):
pass
class Dog(Animal):
def speak(self):
return "Woof!"
# Использование
dog = Dog()
print(dog.speak()) # Вывод: Woof!
class Canine:
def bark(self):
return "Bark!"
class Feline:
def meow(self):
return "Meow!"
class CatDog(Canine, Feline):
pass
# Использование
catdog = CatDog()
print(catdog.bark()) # Вывод: Bark!
print(catdog.meow()) # Вывод: Meow!
class Animal:
def speak(self):
pass
class Dog(Animal):
def speak(self):
return "Woof!"
class Bulldog(Dog):
def speak(self):
return "Woof! I am a Bulldog."
# Использование
bulldog = Bulldog()
print(bulldog.speak()) # Вывод: Woof! I am a Bulldog.
class Animal:
def speak(self):
pass
class Dog(Animal):
def speak(self):
return "Woof!"
class Cat(Animal):
def speak(self):
return "Meow!"
# Использование
dog = Dog()
cat = Cat()
print(dog.speak()) # Вывод: Woof!
print(cat.speak()) # Вывод: Meow!
class Canine:
def bark(self):
return "Bark!"
class Feline:
def meow(self):
return "Meow!"
class Animal:
def speak(self):
pass
class CatDog(Animal, Canine, Feline):
def speak(self):
return f"{self.bark()} {self.meow()}"
# Использование
catdog = CatDog()
print(catdog.speak()) # Вывод: Bark! Meow!
07 Nov, 16:10
07 Nov, 09:10
from abc import ABC, abstractmethod
class Animal(ABC):
@abstractmethod
def speak(self):
pass
class Dog(Animal):
def speak(self):
return "Woof!"
class Cat(Animal):
def speak(self):
return "Meow!"
# animal = Animal() # Ошибка: Нельзя создать экземпляр абстрактного класса
dog = Dog()
cat = Cat()
print(dog.speak()) # Вывод: Woof!
print(cat.speak()) # Вывод: Meow!
Animal
объявлен абстрактным (наследуется от ABC
). В классе Animal
объявлен абстрактный метод speak
, который не имеет реализации.Dog
и Cat
наследуют от Animal
и реализуют метод speak
. Если бы они не реализовали метод speak
, возникла бы ошибка при попытке создания экземпляра этих классов.Dog
и Cat
создаются и их методы speak
вызываются, возвращая соответствующие строки.06 Nov, 16:10
06 Nov, 09:10
class MyClass:
def public_method(self):
print("This is a public method")
# Создание экземпляра класса
obj = MyClass()
# Вызов публичного метода
obj.public_method() # This is a public method
self
.class MyClass:
def public_method(self):
print("This is a public method")
def another_method(self):
print("Calling public_method from another_method")
self.public_method()
# Создание экземпляра класса
obj = MyClass()
# Вызов метода, который вызывает другой публичный метод
obj.another_method()
# Output:
# Calling public_method from another_method
# This is a public method
class MyClass:
def public_method(self):
print("This is a public method")
# Создание экземпляра класса
obj = MyClass()
# Вызов публичного метода
obj.public_method() # This is a public method
05 Nov, 16:10
05 Nov, 09:10
class Singleton:
_instance = None
def __new__(cls, *args, **kwargs):
if not cls._instance:
cls._instance = super(Singleton, cls).__new__(cls, *args, **kwargs)
return cls._instance
# Пример использования
singleton1 = Singleton()
singleton2 = Singleton()
print(singleton1 is singleton2) # True
def singleton(cls):
instances = {}
def get_instance(*args, **kwargs):
if cls not in instances:
instances[cls] = cls(*args, **kwargs)
return instances[cls]
return get_instance
@singleton
class Singleton:
pass
# Пример использования
singleton1 = Singleton()
singleton2 = Singleton()
print(singleton1 is singleton2) # True
class SingletonMeta(type):
_instances = {}
def __call__(cls, *args, **kwargs):
if cls not in cls._instances:
cls._instances[cls] = super(SingletonMeta, cls).__call__(*args, **kwargs)
return cls._instances[cls]
class Singleton(metaclass=SingletonMeta):
pass
# Пример использования
singleton1 = Singleton()
singleton2 = Singleton()
print(singleton1 is singleton2) # True
# module_singleton.py
class Singleton:
pass
singleton = Singleton()
# Пример использования
import module_singleton
singleton1 = module_singleton.singleton
singleton2 = module_singleton.singleton
print(singleton1 is singleton2) # True
04 Nov, 16:10
04 Nov, 09:10
import unittest
def add(a, b):
return a + b
class TestAddFunction(unittest.TestCase):
def test_add_positive_numbers(self):
self.assertEqual(add(2, 3), 5)
def test_add_negative_numbers(self):
self.assertEqual(add(-1, -1), -2)
if __name__ == '__main__':
unittest.main()
import unittest
class Database:
def connect(self):
return "Connected to database"
class Application:
def __init__(self):
self.db = Database()
def start(self):
return self.db.connect()
class TestApplication(unittest.TestCase):
def test_application_start(self):
app = Application()
self.assertEqual(app.start(), "Connected to database")
if __name__ == '__main__':
unittest.main()
def login(username, password):
if username == "admin" and password == "secret":
return "Login successful"
else:
return "Login failed"
class TestLoginFunction(unittest.TestCase):
def test_valid_login(self):
self.assertEqual(login("admin", "secret"), "Login successful")
def test_invalid_login(self):
self.assertEqual(login("user", "password"), "Login failed")
if __name__ == '__main__':
unittest.main()
class SystemTest(unittest.TestCase):
def test_system(self):
app = Application()
result = app.start()
self.assertEqual(result, "Connected to database")
self.assertEqual(login("admin", "secret"), "Login successful")
if __name__ == '__main__':
unittest.main()
03 Nov, 16:10
03 Nov, 09:10
self
).class Dog:
def __init__(self, name):
self.name = name # Атрибут объекта
def bark(self):
return f"{self.name} says woof!"
dog = Dog("Buddy")
print(dog.bark()) # Buddy says woof!
cls
). Для создания метода класса используется декоратор @classmethod
.class Dog:
species = "Canis lupus familiaris" # Атрибут класса
@classmethod
def get_species(cls):
return cls.species
print(Dog.get_species()) # Canis lupus familiaris
self
), ни ссылку на класс (cls
). Для создания статического метода используется декоратор @staticmethod
.class Dog:
@staticmethod
def is_domesticated():
return True
print(Dog.is_domesticated()) # True
__init__
: Инициализация объекта.__str__
: Строковое представление объекта.__repr__
: Официальное строковое представление объекта, используемое для отладки.__len__
: Определяет длину объекта.__add__
: Перегружает оператор сложения.class Dog:
def __init__(self, name, age):
self.name = name
self.age = age
def __str__(self):
return f"{self.name} is {self.age} years old"
dog = Dog("Buddy", 2)
print(dog) # Buddy is 2 years old
02 Nov, 16:10
02 Nov, 09:10
abc
(Abstract Base Classes). Абстрактный класс не может быть инстанцирован и предназначен для создания шаблонов, которые должны быть реализованы в подклассах. abc
.ABC
(абстрактный базовый класс), который предоставляется модулем abc
.@abstractmethod
. Эти методы должны быть реализованы в подклассах, иначе они тоже станут абстрактными.from abc import ABC, abstractmethod
# Создание абстрактного класса
class Animal(ABC):
@abstractmethod
def make_sound(self):
pass
@abstractmethod
def move(self):
pass
# Попытка создания экземпляра абстрактного класса приведет к ошибке
# animal = Animal() # TypeError: Can't instantiate abstract class Animal with abstract methods make_sound, move
# Создание подклассов, которые реализуют абстрактные методы
class Dog(Animal):
def make_sound(self):
return "Woof"
def move(self):
return "Runs"
class Bird(Animal):
def make_sound(self):
return "Tweet"
def move(self):
return "Flies"
# Теперь можно создать экземпляры подклассов
dog = Dog()
print(dog.make_sound()) # Woof
print(dog.move()) # Runs
bird = Bird()
print(bird.make_sound()) # Tweet
print(bird.move()) # Flies
23 Oct, 16:10
23 Oct, 09:10
from abc import ABC, abstractmethod
class CaffeineBeverage(ABC):
def prepare_recipe(self):
self.boil_water()
self.brew()
self.pour_in_cup()
self.add_condiments()
def boil_water(self):
print("Boiling water")
def pour_in_cup(self):
print("Pouring into cup")
@abstractmethod
def brew(self):
pass
@abstractmethod
def add_condiments(self):
pass
class Tea(CaffeineBeverage):
def brew(self):
print("Steeping the tea")
def add_condiments(self):
print("Adding lemon")
class Coffee(CaffeineBeverage):
def brew(self):
print("Dripping coffee through filter")
def add_condiments(self):
print("Adding sugar and milk")
# Клиентский код для использования паттерна Шаблонный метод
def main():
tea = Tea()
coffee = Coffee()
print("Making tea:")
tea.prepare_recipe()
print("\nMaking coffee:")
coffee.prepare_recipe()
if __name__ == "__main__":
main()
prepare_recipe
, который описывает последовательность шагов алгоритма.brew
и add_condiments
, определяя конкретные шаги для приготовления чая и кофе.23 Oct, 07:00
22 Oct, 16:10
22 Oct, 09:10
lru_cache
в модуле functools
. Этот декоратор можно использовать для кэширования результатов вызова функции.from functools import lru_cache
@lru_cache(maxsize=4)
def expensive_computation(n):
print(f"Computing {n}...")
return n * n
def main():
print(expensive_computation(1)) # Computing 1... -> 1
print(expensive_computation(2)) # Computing 2... -> 4
print(expensive_computation(3)) # Computing 3... -> 9
print(expensive_computation(4)) # Computing 4... -> 16
print(expensive_computation(1)) # Cached -> 1
print(expensive_computation(2)) # Cached -> 4
print(expensive_computation(5)) # Computing 5... -> 25 (1 removed from cache)
print(expensive_computation(3)) # Cached -> 9
print(expensive_computation(1)) # Computing 1... -> 1 (2 removed from cache)
if __name__ == "__main__":
main()
expensive_computation
, добавляя механизм кэширования.22 Oct, 07:08
21 Oct, 16:10
21 Oct, 09:10
from xmlrpc.server import SimpleXMLRPCServer
def add(x, y):
return x + y
def main():
server = SimpleXMLRPCServer(("localhost", 8000))
print("Listening on port 8000...")
server.register_function(add, "add")
server.serve_forever()
if __name__ == "__main__":
main()
import xmlrpc.client
def main():
with xmlrpc.client.ServerProxy("http://localhost:8000/") as proxy:
result = proxy.add(5, 3)
print(f"5 + 3 = {result}")
if __name__ == "__main__":
main()
add
, которая принимает два числа и возвращает их сумму. Сервер ожидает запросы на порту 8000.ServerProxy
и вызывает удаленную функцию add
с аргументами 5 и 3. Результат вызова выводится на экран.20 Oct, 16:10
20 Oct, 09:10
from abc import ABC, abstractmethod
# Интерфейс состояния
class State(ABC):
@abstractmethod
def insert_coin(self):
pass
@abstractmethod
def eject_coin(self):
pass
@abstractmethod
def dispense(self):
pass
# Конкретные состояния
class NoCoinState(State):
def __init__(self, machine):
self.machine = machine
def insert_coin(self):
print("Coin inserted.")
self.machine.set_state(self.machine.has_coin_state)
def eject_coin(self):
print("No coin to eject.")
def dispense(self):
print("Insert coin first.")
class HasCoinState(State):
def __init__(self, machine):
self.machine = machine
def insert_coin(self):
print("Coin already inserted.")
def eject_coin(self):
print("Coin ejected.")
self.machine.set_state(self.machine.no_coin_state)
def dispense(self):
print("Dispensing product.")
self.machine.set_state(self.machine.no_coin_state)
# Контекст
class VendingMachine:
def __init__(self):
self.no_coin_state = NoCoinState(self)
self.has_coin_state = HasCoinState(self)
self.state = self.no_coin_state
def set_state(self, state: State):
self.state = state
def insert_coin(self):
self.state.insert_coin()
def eject_coin(self):
self.state.eject_coin()
def dispense(self):
self.state.dispense()
# Клиентский код
def main():
machine = VendingMachine()
machine.insert_coin() # Coin inserted.
machine.dispense() # Dispensing product.
machine.eject_coin() # No coin to eject.
machine.insert_coin() # Coin inserted.
machine.eject_coin() # Coin ejected.
machine.dispense() # Insert coin first.
if __name__ == "__main__":
main()
State
и определяют поведение для каждого состояния.19 Oct, 16:10
19 Oct, 09:10
from abc import ABC, abstractmethod
class Observer(ABC):
@abstractmethod
def update(self, message: str):
pass
class ConcreteObserver(Observer):
def __init__(self, name: str):
self._name = name
def update(self, message: str):
print(f"{self._name} received message: {message}")
class Subject:
def __init__(self):
self._observers = []
def add_observer(self, observer: Observer):
self._observers.append(observer)
def remove_observer(self, observer: Observer):
self._observers.remove(observer)
def notify_observers(self, message: str):
for observer in self._observers:
observer.update(message)
# Клиентский код для использования паттерна Наблюдатель
def main():
subject = Subject()
observer1 = ConcreteObserver("Observer 1")
observer2 = ConcreteObserver("Observer 2")
subject.add_observer(observer1)
subject.add_observer(observer2)
subject.notify_observers("Event 1") # Observer 1 received message: Event 1
# Observer 2 received message: Event 1
subject.remove_observer(observer1)
subject.notify_observers("Event 2") # Observer 2 received message: Event 2
if __name__ == "__main__":
main()
update
, который должны реализовать все конкретные наблюдатели.Observer
и определяет, как наблюдатель должен реагировать на обновления.18 Oct, 16:10
18 Oct, 09:10
class Memento:
def __init__(self, state: str):
self._state = state
def get_state(self) -> str:
return self._state
class TextEditor:
def __init__(self):
self._state = ""
self._history = []
def type(self, text: str):
self._save_state()
self._state += text
def _save_state(self):
self._history.append(Memento(self._state))
def undo(self):
if not self._history:
return
memento = self._history.pop()
self._state = memento.get_state()
def get_content(self) -> str:
return self._state
# Клиентский код для использования паттерна Хранитель
def main():
editor = TextEditor()
editor.type("Hello, ")
editor.type("world!")
print(editor.get_content()) # Hello, world!
editor.undo()
print(editor.get_content()) # Hello,
editor.undo()
print(editor.get_content()) #
if __name__ == "__main__":
main()
Memento
для сохранения и восстановления своего состояния. Методы type
и undo
позволяют редактировать текст и отменять изменения.17 Oct, 16:10
17 Oct, 09:10
# Подсистема 1
class CPU:
def freeze(self):
print("CPU freezing")
def jump(self, position):
print(f"CPU jumping to {position}")
def execute(self):
print("CPU executing")
# Подсистема 2
class Memory:
def load(self, position, data):
print(f"Memory loading {data} at {position}")
# Подсистема 3
class HardDrive:
def read(self, lba, size):
return f"Reading {size} bytes from LBA {lba}"
# Фасад
class ComputerFacade:
def __init__(self):
self.cpu = CPU()
self.memory = Memory()
self.hard_drive = HardDrive()
def start(self):
self.cpu.freeze()
self.memory.load("0x00", self.hard_drive.read("100", "1024"))
self.cpu.jump("0x00")
self.cpu.execute()
# Клиентский код
computer = ComputerFacade()
computer.start()
16 Oct, 16:10
16 Oct, 09:10
from abc import ABC, abstractmethod
# Абстрактный компонент
class Graphic(ABC):
@abstractmethod
def draw(self):
pass
# Лист
class Circle(Graphic):
def draw(self):
print("Drawing a Circle")
# Компоновщик
class CompositeGraphic(Graphic):
def __init__(self):
self.graphics = []
def add(self, graphic):
self.graphics.append(graphic)
def remove(self, graphic):
self.graphics.remove(graphic)
def draw(self):
for graphic in self.graphics:
graphic.draw()
# Клиентский код
circle1 = Circle()
circle2 = Circle()
composite = CompositeGraphic()
composite.add(circle1)
composite.add(circle2)
# Рисуем все элементы
composite.draw()