Python staticmethod , classmethod

23 Мар 2021 , 242

В Python методы - это мощный инструмент для организации кода и выполнения действий как на уровне объектов, так и на уровне классов. Давайте ближе познакомимся с различными типами методов, доступными в Python.

Методы можно подразделить на следующие типы:

  • Методы объектов

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

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

Методы объектов

Методы объектов - это методы, которые привязаны к экземплярам классов. Они имеют доступ к данным объекта и могут изменять его состояние. Эти методы вызываются на конкретных объектах и могут использовать атрибуты этого объекта.

Рассмотрим на примере:


class Car:
    def __init__(self, brand, model):
        self.brand = brand # Атрибут объекта
        self.model = model # Атрибут объекта
    
    #Определяем метод объекта
    def start_engine(self):
        print(f"{self.brand} {self.model} двигатель запущен")

my_car = Car("Toyota", "Camry")
my_car.start_engine()  # Вызываем метод объекта

Тут мы определил метод start_engine.

Метод объекта всегда имеет первый параметр с именем self, который автоматически связывается с текущим объектом, на котором метод вызывается. self дает доступ к данным и методам объекта, что делает возможным взаимодействие с его состоянием.

Метод объекта вызывается на конкретном объекте класса. Это означает, что для вызова метода объекта необходимо иметь экземпляр класса, на котором этот метод будет выполнен. Выше в примере мы создали my_car экземпляр класса Car и только потом вызвали метод start_engine. Метод объекта привязан к конкретному экземпляру класса. Внутри метода объекта можно получить доступ к данным и атрибутам этого экземпляра через параметр self. Это означает, что метод объекта может взаимодействовать с уникальными характеристиками объекта, которые могут различаться между разными экземплярами класса.

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

Если у метода есть декоратор @classmethod , то это метод класса и его первым аргументом должен быть cls(имя может быть любым , кроме зарезервированного слова class), который ссылается на класс.

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

Классический пример использования метода класса можно продемонстрировать на классе, представляющем геометрические фигуры. Допустим, у нас есть класс Shape, который имеет атрибут count для отслеживания количества созданных фигур, и метод класса get_count для получения этого количества:


class Shape:
    count = 0  # Атрибут класса для отслеживания количества созданных фигур

    def __init__(self, name):
        self.name = name # Атрибут объекта
        Shape.count += 1  # Увеличиваем счетчик при создании новой фигуры

    def get_name(self):
        return self.name

    #Определяем метод класса. Обратите внимание, что первыми аргументом является cls(сам класс)
    @classmethod
    def get_count(cls):
        return cls.count

# Создаем несколько фигур
circle = Shape("Круг")
rectangle = Shape("Прямоугольник")
triangle = Shape("Треугольник")

# Получаем количество созданных фигур с использованием метода класса
total_count = Shape.get_count()
print(f"Всего создано фигур: {total_count}")  # Вывод: "Всего создано фигур: 3"


Метод класса вызывается следующи образом Shape.get_count() и как мы видим в отличие от метода объекта , тут не нужен экземпляр класса , а вызов идет от класса Shape. Также метод класса не имеет доступа к данным объекта, но может иметь доступ к атрибутам класса через cls. Методы класса часто используются для работы с общими данными, которые принадлежат классу, а не конкретным экземплярам.

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

Если у метода есть декоратор @staticmethod ,то это статический метод и его первым аргументом будет не объект и не класс.

Статические методы не имеют доступа к состоянию класса или объекта, потому что не принимают аргументы cls или self.


class Shape:
    def __init__(self, name, sides):
        self.name = name
        self.sides = sides

    @staticmethod
    def area(base, height):
        return base * height

# Вызываем статический метод без создания экземпляра класса
rectangle_area = Shape.area(5, 10)
print(f"Площадь прямоугольника: {rectangle_area}")

triangle_area = Shape.area(4, 6)
print(f"Площадь треугольника: {triangle_area}")

В этом примере метод area является статическим, поэтому мы можем вызвать его напрямую через класс Shape, не создавая экземпляры объектов. В данном случае статический метод принимает два аргумента base (основание) и height (высоту), и возвращает площадь фигуры. А так мы можем написать статистический метод , который не примает никаких аргументов. Например , статистический метод генерации уникальных идентификаторов.

Использование статического метода в данном случае удобно, так как расчет площади фигуры не зависит от каких-либо данных объектов Shape или их состояния.

Статический метод не зависит ни от объектов, ни от класса, и выполняет операции, которые могут быть выполнены независимо от какого-либо контекста. Для статистического метода не нужно принимать первыми аргументом ни экземпляр класса (self) , как в случае методом объекта , ни сам класс (cls) как в случае метода класса и еще статический метод не имеет доступа ни к аттрибутам и методам объекта или класса

Заключение

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

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

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

Конечно, если у вас есть какие-либо вопросы, комментарии или пожелания по статье или любым другим вопросам, не стесняйтесь оставлять их в комментариях. Я готов помочь вам и ответить на любые вопросы, которые у вас могут возникнуть.

comments powered by Disqus

Подписка

Подпишитесь на наш список рассылки, чтобы получать обновления из блога

Рубрики

Теги