Справочник Python

Полное руководство по языку на русском

ООП (Объектно-ориентированное программирование)

Классы и объекты

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  # возврат значения