ООП (Объектно-ориентированное программирование)
Классы и объекты
class User:
def __init__(self, name, age):
self.name = name # обращение к атрибуту экземпляра
self.age = age # обращение к атрибуту экземпляра
def greet(self):
return f"Привет, я {self.name}" # возврат значения
user = User("Анна", 30) # присваивание
print(user.greet()) # вывод в консоль
Методы класса
class Counter:
count = 0 # числовое значение
@classmethod # метод класса
def increment(cls):
cls.count += 1
@staticmethod # статический метод
def info():
return "Счётчик" # возврат значения
def instance_method(self):
return self.count # возврат значения
Counter.increment()
Counter.info()
Свойства (property)
class Person:
def __init__(self, name):
self._name = name # обращение к атрибуту экземпляра
@property # свойство класса
def name(self):
return self._name.upper() # возврат значения
@name.setter # сеттер свойства
def name(self, value):
if not value: # условие
raise ValueError("Имя не может быть пустым") # выброс исключения
self._name = value # обращение к атрибуту экземпляра
@name.deleter # делитер свойства
def name(self):
print("Удаление имени") # вывод в консоль
del self._name # обращение к атрибуту экземпляра
p = Person("Анна") # присваивание
print(p.name) # вывод в консоль
p.name = "Ольга"
Наследование
class Animal:
def __init__(self, name):
self.name = name # обращение к атрибуту экземпляра
def speak(self):
raise NotImplementedError # выброс исключения
class Dog(Animal):
def speak(self):
return f"{self.name}: Гав!" # возврат значения
class Cat(Animal):
def speak(self):
return f"{self.name}: Мяу!" # возврат значения
# super() — вызов родительского метода
class Developer:
def __init__(self, name, lang):
self.name = name # обращение к атрибуту экземпляра
self.lang = lang # обращение к атрибуту экземпляра
class SeniorDeveloper(Developer):
def __init__(self, name, lang, years):
super().__init__(name, lang) # вызов родительского метода
self.years = years # обращение к атрибуту экземпляра
Магические методы (dunder)
class Vector:
def __init__(self, x, y):
self.x = x # обращение к атрибуту экземпляра
self.y = y # обращение к атрибуту экземпляра
def __repr__(self): # repr()
return f"Vector({self.x}, {self.y})" # возврат значения
def __str__(self): # str(), print()
return f"({self.x}, {self.y})" # возврат значения
def __add__(self, other): # +
return Vector(self.x + other.x, self.y + other.y) # возврат значения
def __eq__(self, other): # ==
return self.x == other.x and self.y == other.y # возврат значения
def __lt__(self, other): # < (для сортировки)
return (self.x**2 + self.y**2) < (other.x**2 + other.y**2) # возврат значения
def __len__(self): # len()
return int((self.x**2 + self.y**2) ** 0.5) # возврат значения
def __getitem__(self, i):
return (self.x, self.y)[i] # возврат значения
v1 = Vector(2, 3) # присваивание
v2 = Vector(1, 4) # присваивание
print(v1 + v2) # (3, 7)
print(v1 == Vector(2, 3)) # True
dataclasses (Python 3.7+)
from dataclasses import dataclass, field # импорт модуля
@dataclass # декоратор класса данных
class User:
name: str
age: int = 0
emails: list = field(default_factory=list)
is_active: bool = True
user = User("Анна", 30) # присваивание
print(user) # User(name='Анна', age=30, emails=[], is_active=True)
print(user == User("Анна", 30)) # True
# Frozen (неизменяемый)
from dataclasses import dataclass # импорт модуля
@dataclass(frozen=True) # декоратор класса данных
class Point:
x: int
y: int
Абстрактные классы
from abc import ABC, abstractmethod # импорт модуля
class Shape(ABC):
@abstractmethod # абстрактный метод
def area(self) -> float:
pass # пустая заглушка
class Circle(Shape):
def __init__(self, radius):
self.radius = radius # обращение к атрибуту экземпляра
def area(self):
return 3.14159 * self.radius ** 2 # возврат значения