Python staticmethod , classmethod
В 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) как в случае метода класса и еще статический метод не имеет доступа ни к аттрибутам и методам объекта или класса
Заключение
Статический метод не зависит ни от объектов, ни от класса, и выполняет операции, которые могут быть выполнены независимо от какого-либо контекста.
Метод класса связан с классом, а не с конкретными объектами, и может выполнять операции на уровне класса, воздействуя на его атрибуты или выполняя общие задачи, которые требуют доступа к классу.
Метод объекта связан с конкретным экземпляром класса и работает с данными и методами этого объекта, изменяя его состояние или выполняя задачи, связанные с данным объектом.
Конечно, если у вас есть какие-либо вопросы, комментарии или пожелания по статье или любым другим вопросам, не стесняйтесь оставлять их в комментариях. Я готов помочь вам и ответить на любые вопросы, которые у вас могут возникнуть.