Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥8👍2
Это практика динамического изменения или расширения кода в рантайме. Это позволяет изменять поведение модулей или классов без изменения их исходного кода. Monkey patching может быть полезен для исправления багов, добавления функциональности или изменения поведения библиотек, особенно когда их исходный код недоступен или его нежелательно изменять.
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 # Ошибка: должно быть сложение, а не вычитание
Мы можем использовать monkey patch, чтобы исправить эту ошибку, не изменяя исходный код:
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
Мы также можем использовать monkey patch для добавления новых методов в существующие классы:
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...
Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍10
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍8
Это метод тестирования, при котором проверяется работа отдельных модулей или компонентов кода, обычно на уровне функций или методов. Цель юнит-тестирования — убедиться, что каждая часть кода работает правильно независимо от других частей.
Юнит-тесты охватывают небольшие участки кода, такие как отдельные функции или методы.
Тесты выполняются в изолированной среде, что позволяет выявлять проблемы именно в тестируемом модуле без влияния внешних зависимостей.
Юнит-тесты легко автоматизировать, что позволяет быстро проверять изменения в коде.
Юнит-тесты должны выполняться регулярно, например, при каждом изменении кода, чтобы обеспечить его стабильность.
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
Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍11
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥25👍15
Это техника в программировании, используемая для замены реальных объектов или компонентов системы временными объектами (моками) во время тестирования. Эти временные объекты имитируют поведение реальных объектов, позволяя изолировать и тестировать отдельные части кода без зависимости от других компонентов системы.
Основные классы для создания мок-объектов.
Декоратор или контекстный менеджер для замены объектов на моки во время выполнения теста.
Простой пример с использованием
Mockfrom 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()
Использование
MagicMockfrom unittest.mock import MagicMock
# Создание объекта MagicMock
mock = MagicMock()
# Настройка возвращаемого значения для магического метода __str__
mock.__str__.return_value = "MagicMocked String"
print(str(mock)) # Вывод: MagicMocked String
Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍5❤1
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍22🔥15
Относятся к так называемым "магическим методам" или "специальным методам". Они позволяют определять поведение объектов при использовании операторов сложения (+), умножения (*), вычитания (-) и деления (/).
Этот метод отвечает за операцию сложения. Если вы определяете этот метод в вашем классе, вы можете контролировать, что происходит, когда вы используете оператор + между объектами этого класса.
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)
Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍9❤2
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍10🔥2
Используется для определения логической истинности (truthiness) объекта. Когда вызывается функция
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")
Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍6❤2
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍27🔥9❤1
Также относятся к "магическим методам" и используются для перегрузки операторов сравнения. Эти методы позволяют вам определить, как объекты вашего класса будут сравниваться друг с другом с использованием операторов равенства, неравенства, меньше, меньше или равно, больше и больше или равно.
Отвечает за оператор равенства
==. Он позволяет определить, когда два объекта вашего класса считаются равными.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
Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍16❤1
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍15🔥8😁3💊2
Позволяет объектам вашего класса быть вызываемыми как функции. Когда вы определяете этот метод в своем классе, вы можете использовать экземпляры этого класса как функции.
Полезен, когда вы хотите, чтобы объекты вашего класса могли выполнять какое-то действие при вызове. Это может быть полезно для реализации шаблонов проектирования, таких как замыкания, обработчики событий, или просто для удобства, если объект должен часто выполнять одно и то же действие.
Для того чтобы использовать метод
__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)
Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍3
- `GET` для получения данных с сервера.
- `POST` для отправки данных на сервер (создание ресурса).
- `PUT` для обновления или создания ресурса.
- `DELETE` для удаления ресурса.
- `PATCH` для частичного обновления ресурса.
- `HEAD` для получения заголовков без тела ответа.
- `OPTIONS` для получения информации о поддерживаемых методах.
Эти методы обеспечивают основное взаимодействие клиента и сервера.
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥12👍8😁2💊1
Позволяют объектам вашего класса работать как контейнеры, подобные спискам или словарям. Они отвечают за доступ к элементам, установку значений элементов и удаление элементов по индексам или ключам.
Используется для доступа к элементам объекта по индексу или ключу. Он вызывается, когда вы используете синтаксис квадратных скобок для доступа к элементу.
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}
Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍9❤1
1. Явно указать в запросе только те столбцы, которые доступны, вместо использования `SELECT *`.
2. Убедиться, что права доступа на уровне пользователя или роли не запрещают чтение нужных столбцов.
3. Использовать средства обработки ошибок в коде, чтобы обрабатывать исключения, если доступ к полю невозможен.
Это помогает избежать ошибок и выполнить запрос успешно.
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
💊7
Используются для поддержки менеджеров контекста. Менеджеры контекста позволяют выполнять подготовительные и завершающие действия вокруг блока кода, используя конструкцию
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}")
Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍9❤1
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚Базу Знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍20
Используется для создания статических методов в классе. Статический метод — это метод, который не зависит от состояния экземпляра класса и может быть вызван напрямую на классе, не создавая экземпляр. Такие методы обычно используются для выполнения действий, которые логически связаны с классом, но не требуют доступа к его экземплярам или класс-методу.
Статические методы позволяют логически группировать функции, которые имеют отношение к классу, но не требуют доступа к его данным.
Они могут быть вызваны без создания экземпляра класса, что удобно для утилитарных функций.
Помогают держать код более организованным, особенно когда методы имеют логическую связь с классом, но не требуют доступа к его атрибутам или методам.
Для создания статического метода, нужно использовать декоратор
@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("test@example.com")) # Вывод: 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
Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍10❤1
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍18🔥3