Методы в классах Python

В Python можно выделить три основных типа методов, которые могут быть реализованы внутри класса:

  1. Методы экземпляра
  2. Методы класса
  3. Статические методы

Рассмотрим каждый тип методов подробно, с примерами.

Методы экземпляра

Методы экземпляра являются наиболее распространёнными в Python. Эти методы привязаны к конкретному экземпляру класса и могут взаимодействовать с его данными. Чтобы метод был привязан к экземпляру, первым аргументом метода всегда передаётся сам экземпляр, традиционно обозначаемый как self.

Пример 1: Метод экземпляра

class Example:
    def instance_hello(self):
        print(f'Hello from {self}')

Создадим экземпляр класса Example и вызовем метод:

example = Example()
example.instance_hello()  # Вывод: Hello from <__main__.Example object at 0x...>

В этом примере метод instance_hello принимает экземпляр класса self и выводит сообщение. Он работает только от экземпляра класса.


Пример 2: Метод, работающий с атрибутами экземпляра

class Person:
    def __init__(self, name, age):
        self.name = name
        self.age = age

    def introduce(self):
        print(f'My name is {self.name}, and I am {self.age} years old.')

Создадим экземпляр класса Person:

john = Person("John", 25)
john.introduce()  # Вывод: My name is John, and I am 25 years old.

В этом примере метод экземпляра introduce работает с атрибутами экземпляра, используя self.


Методы класса

Методы класса не привязаны к экземпляру, а привязаны непосредственно к самому классу. Для их создания используется декоратор @classmethod. В качестве первого аргумента такой метод получает не экземпляр, а класс, который передаётся как cls.

Пример 3: Метод класса

class Example:
    @classmethod
    def class_hello(cls):
        print(f'Hello from the class {cls}')

Теперь мы можем вызвать этот метод как через класс, так и через экземпляр:

Example.class_hello()  # Вывод: Hello from the class <class '__main__.Example'>
example = Example()
example.class_hello()  # Вывод: Hello from the class <class '__main__.Example'>

Метод класса всегда будет работать с самим классом, даже если вызван от экземпляра.


Пример 4: Фабричный метод

Фабричные методы создают новые экземпляры класса. Они особенно полезны, если создание объектов требует особой логики.

class Car:
    def __init__(self, color, model):
        self.color = color
        self.model = model

    @classmethod
    def create_red_tesla(cls):
        return cls('Red', 'Tesla')

car = Car.create_red_tesla()
print(car.color, car.model)  # Вывод: Red Tesla

Здесь метод create_red_tesla создаёт и возвращает новый экземпляр класса Car.


Статические методы

Статические методы не принимают ни self, ни cls. Они не привязаны ни к экземпляру, ни к классу и обычно служат для выполнения вспомогательных задач, связанных с классом.

Пример 5: Статический метод

class MathOperations:
    @staticmethod
    def add(a, b):
        return a + b

result = MathOperations.add(5, 3)
print(result)  # Вывод: 8

Статический метод можно вызывать как от самого класса, так и от экземпляра, однако не имеет доступа ни к атрибутам экземпляра, ни к атрибутам класса.


Пример 6: Статический метод для преобразований

class TemperatureConverter:
    @staticmethod
    def celsius_to_fahrenheit(celsius):
        return celsius * 9/5 + 32

    @staticmethod
    def fahrenheit_to_celsius(fahrenheit):
        return (fahrenheit - 32) * 5/9

Теперь вы можете использовать этот класс для преобразования температур:

print(TemperatureConverter.celsius_to_fahrenheit(0))  # Вывод: 32.0
print(TemperatureConverter.fahrenheit_to_celsius(32))  # Вывод: 0.0


Комбинирование методов

Иногда может возникнуть необходимость комбинировать методы разных типов в одном классе. Например, можно использовать методы класса для управления общим состоянием класса, а методы экземпляра для работы с конкретными объектами.

Пример 7: Комбинация методов класса и экземпляра

class Library:
    total_books = 0

    def __init__(self, name):
        self.name = name
        self.books = 0

    def add_book(self):
        self.books += 1
        Library.total_books += 1

    @classmethod
    def total_books_in_all_libraries(cls):
        print(f'Total books in all libraries: {cls.total_books}')

Здесь метод экземпляра add_book изменяет как состояние конкретной библиотеки, так и общее состояние всех библиотек через атрибут класса. Метод класса total_books_in_all_libraries работает с общим состоянием класса:

library1 = Library("City Library")
library2 = Library("University Library")

library1.add_book()
library1.add_book()
library2.add_book()

Library.total_books_in_all_libraries()  # Вывод: Total books in all libraries: 3


Пример 8: Комбинация статического и метода класса

class Circle:
    PI = 3.14159

    def __init__(self, radius):
        self.radius = radius

    def area(self):
        return Circle.PI * (self.radius ** 2)

    @classmethod
    def circle_from_diameter(cls, diameter):
        radius = diameter / 2
        return cls(radius)

    @staticmethod
    def format_area(area):
        return f'The area is: {area:.2f} square units'

Здесь:

  • Метод класса circle_from_diameter создаёт новый объект Circle на основе диаметра.
  • Статический метод format_area форматирует площадь.

Пример использования:

circle = Circle.circle_from_diameter(10)
area = circle.area()
print(Circle.format_area(area))  # Вывод: The area is: 78.54 square units


Итоговая таблица различий

Тип методаПривязан кПервый аргументВызов отДоступ к атрибутам
Метод экземпляраЭкземпляру классаselfЭкземпляраЧерез self доступ к экземпляру и классу
Метод классаКлассуclsКласса и экземпляраЧерез cls доступ к атрибутам класса
Статический методНе привязан ни к чемуНет обязательных аргументовКласса и экземпляраНет доступа к атрибутам экземпляра или класса

 

Мы рассмотрели три типа методов, которые можно использовать в Python: методы экземпляра, методы класса и статические методы. Методы экземпляра используются для работы с конкретными объектами, методы класса — для работы с классом в целом, а статические методы — для выполнения вспомогательных задач, не привязанных ни к экземплярам, ни к классу.

Перейти к следующему шагу

Комментарии