В чем разница между методами экземпляра, методами класса и статическими методами в Python?

Опубликован: 11.08.2024 36

В Python, как правило, существует три типа методов:

  • методы экземпляра (вызываются из экземпляров классов и работают с атрибутами экземпляров и атрибутами классов);
  • методы класса (вызываются через класс, реже через его экземпляры, и имеют доступ только к атрибутам самого класса, в котором объявлены);
  • статические методы (изолированные функции, которые работают только с параметрами, прописанными в ней самой и не имеют доступа к атрибутам класса или его экземпляров).

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

Методы экземпляра - это обычные функции, используемые при создании классов, в которых первым параметром указывается ключевое слово self – ссылка на экземпляр класса, из которого метод был вызван.

class Student:

    def __init__(self, a, b):
        self.a = a
        self.b = b 

    def avg(self):
        return (self.a + self.b) / 2

s1 = Student(10, 20)
print( s1.avg() )
15.0

В приведенной примере a и b являются переменными экземпляра, и они инициализируются, когда мы создаем объект класса Student. Если мы хотим вызвать функцию avg(), которая является методом экземпляра, мы должны создать экземпляр класса s1.

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

Методы класса - это функции, имеющие доступ только к переменным класса, у которых первым параметром указывается ключевое слово cls - ссылка на класс, а не self – ссылка на экземпляр класса.

Для создания метода класса обычно используется декоратор @classmetod.

Например, добавим в класс Student атрибуты класса: name, MIN_GRADE, MAX_GRADE и методы класса (info() для вывода имени и validate_grade() для проверки значений оценок студента).

class Student:
    name = "Студент"
    MIN_GRADE = 0
    MAX_GRADE = 100

    def __init__(self, a, b):
        self.a = self.b = 0
        if Student.validate_grade(a) and Student.validate_grade(b):
            self.a = a
            self.b = b 

    def avg(self):
        return (self.a + self.b) / 2

    @classmethod
    def info(cls):
        return cls.name

    @classmethod
    def validate_grade(cls, arg):
        return cls.MIN_GRADE <= arg <= cls.MAX_GRADE

# для вызова метода класса используется пространство имен класса Student
print(Student.info())
Студент

Кроме того, мы можем обратиться к методу класса и внутри класса (например, в функции __init__), используя также имя класса Student или через ключевое слово self (в этом случае интерпретатор Python сам подставит нужный класс в параметр cls данного метода, так как экземпляр содержит информацию о классе, от которого был образован).

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

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

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

class Vector:
    def __init__(self, x, y):
        self.x = x
        self.y = y
        # вызов статического метода внутри класса
        print(f"Радиус вектора: {Vector.norm2(self.x, self.y)}")

    def get_coord(self):
        return self.x, self.y

    @staticmethod
    def norm2(x, y):
        return x*x + y*y

v1 = Vector(10, 20)
Радиус вектора: 500

# вызов статического метода извне класса
print(Vector.norm2(5, 10))
125

В приведенном примере статический метод norm2 вычисляет квадратичную норму вектора с координатами x и y (длину вектора в квадрате или радиус вектора).

Воспользоваться статическим методом можно как вне класса, так и внутри класса.

Похожие посты

Что такое метакласс в Python?

Что такое дескрипторы в Python?

В чем разница между статическими и динамическими атрибутами класса?

Как создать класс и объект класса в Python

Комментариев нет.