Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍11🔥11❤1💊1
Обычные методы работают с экземплярами класса и могут изменять их состояние. Они принимают первым аргументом ссылку на сам экземпляр (
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
Магические методы (или dunder методы, от "double underscore") определяют специальные поведения объектов, такие как инициализация, строковое представление, перегрузка операторов и другие. Они имеют двойное подчеркивание в начале и в конце имени.
Некоторые распространенные магические методы:
__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
Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍23
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍30🔥2💊2
Юнит-тесты проверяют отдельные модули или функции на правильность их работы. Эти тесты изолированы и проверяют минимальные функциональные блоки программы.
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()
Приемочные тесты проверяют систему на соответствие бизнес-требованиям и ожиданиям пользователя. Эти тесты часто проводятся пользователями или командой контроля качества.
Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍13😁1
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍11🔥3❤1
Гарантирует, что класс имеет только один экземпляр и предоставляет глобальную точку доступа к этому экземпляру.
Использование класса с атрибутом класса
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
Использование модуля (встроенная реализация Singleton)
# module_singleton.py
class Singleton:
pass
singleton = Singleton()
# Пример использования
import module_singleton
singleton1 = module_singleton.singleton
singleton2 = module_singleton.singleton
print(singleton1 is singleton2) # True
Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍7
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍10🔥7
Методы по умолчанию являются публичными (public), что означает, что они доступны из любого места программы. Публичный метод можно вызвать как из других методов того же класса, так и из внешнего кода.
Для создания публичного метода в Python достаточно определить метод внутри класса. Имя метода не должно начинаться с подчеркивания (если не используются дополнительные соглашения о доступе).
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
Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍5❤1
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍13
Это метод, объявленный в абстрактном классе, который не имеет реализации и должен быть переопределён в подклассах. Служат для определения интерфейса, который должен быть реализован в наследниках, обеспечивая тем самым реализацию полиморфизма и строгий контракт для классов-наследников.
Не имеет тела, то есть не содержит кода, реализующего его поведение.
Классы, наследующие абстрактный класс, обязаны переопределить все его абстрактные методы, иначе они также должны быть объявлены абстрактными.
Могут быть объявлены только в абстрактных классах. Абстрактный класс не может быть инстанцирован напрямую и служит для определения интерфейса для своих подклассов.
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
вызываются, возвращая соответствующие строки.Позволяют определить интерфейс, который должны реализовать все подклассы.
Обеспечивают реализацию полиморфизма, так как подклассы могут быть использованы через интерфейс базового абстрактного класса.
Гарантируют, что все необходимые методы будут реализованы в подклассах, обеспечивая целостность интерфейса.
Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍11❤1
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍29🔥5💊1
Существуют различные виды наследования, которые позволяют создавать новые классы на основе существующих, что способствует повторному использованию кода и упрощает его сопровождение.
Класс-наследник (подкласс) наследует от одного родительского класса (суперкласса).
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!
Классы-наследники могут использовать методы и атрибуты родительских классов, что уменьшает дублирование кода.
Изменения в родительском классе автоматически распространяются на все классы-наследники.
Позволяет использовать объекты разных классов через интерфейс одного родительского класса, что упрощает обработку иерархий объектов.
Множественное и многоуровневое наследование могут привести к сложной и запутанной иерархии классов.
Классы-наследники зависят от родительских классов, что может усложнить изменения в иерархии.
В языках, поддерживающих множественное наследование, могут возникнуть проблемы с конфликтом имен и порядок разрешения методов (MRO — Method Resolution Order).
Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍11
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍26🔥3❤1
Это декоратор в Python, который используется для определения метода класса. Методы класса работают с самим классом, а не с его экземплярами. В отличие от обычных методов, которые принимают в качестве первого аргумента
self
(ссылку на экземпляр), методы класса принимают cls
(ссылку на класс).Доступ к атрибутам и методам класса: Методы класса имеют доступ ко всем атрибутам и методам класса, но не к атрибутам экземпляров.
Использование декоратора @classmethod: Для определения метода класса используется декоратор.
Часто используются для фабричных методов: Методы класса часто используются для создания альтернативных конструкторов.
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
Обычные методы: Принимают self как первый аргумент и работают с конкретными экземплярами класса. Доступны как к атрибутам класса, так и к атрибутам экземпляра.
Методы класса: Принимают cls как первый аргумент и работают с самим классом. Доступны только к атрибутам класса.
Статические методы: Не принимают автоматически ни self, ни cls. Они могут быть вызваны на классе или экземпляре и не имеют доступа ни к атрибутам класса, ни к атрибутам экземпляра.
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
Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍7❤2
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥8👍3
Используется для обработки исключений, которые могут возникнуть во время выполнения программы. Она позволяет "ловить" ошибки и принимать меры по их устранению или логированию, что предотвращает завершение программы с ошибкой.
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")
Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍7
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍26❤4🔥3
Предоставляет мощные и гибкие инструменты для работы с файлами. Основные операции включают чтение, запись, создание и удаление файлов.
Используется функция
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.")
Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍23
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
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.iss.oneow()) # Вывод: 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