Перейти к основному содержимому

Методы: экземпляра, класса и статические

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

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

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

class HockeyPlayer:
def __init__(self, name, surname, age, team):
self.name = name
self.surname = surname
self.age = age
self.team = team

def get_full_name(self):
return f'{self.name} {self.surname}' # f-строка собирает текст

player = HockeyPlayer('Иван', 'Иванов', 17, 'Метеор')
captain = HockeyPlayer('Павел', 'Петров', 20, 'Вымпел')

print(player.get_full_name()) # Иван Иванов
print(captain.get_full_name()) # Павел Петров
Иван Иванов
Павел Петров

Обратите внимание: player.get_full_name() эквивалентно HockeyPlayer.get_full_name(player) — Python автоматически подставляет self при вызове через точку.

Общее поведение: метод класса

Методы класса помечаются @classmethod и первым аргументом получают сам класс (cls). Они читают/меняют общие настройки.

class HockeyPlayer:
default_position = 'Forward'

@classmethod
def get_default_position(cls):
return cls.default_position

print(HockeyPlayer.get_default_position()) # Forward

HockeyPlayer.default_position = 'Goalkeeper'
print(HockeyPlayer.get_default_position()) # Goalkeeper

player = HockeyPlayer()
print(player.get_default_position()) # Goalkeeper — то же самое
Forward
Goalkeeper
Goalkeeper

Метод не использует личные данные — он смотрит на «общую наклейку» класса, поэтому результат одинаковый при вызове и у класса, и у объекта. Первый параметр cls всегда указывает на класс, с которого сделан вызов.

Полезные утилиты: статический метод

Статические методы помечаются @staticmethod. Им не нужен ни self, ни cls — это просто функции, логически относящиеся к классу.

class HockeyPlayer:
@staticmethod
def get_greeting():
return 'Привет, хоккеист!'

print(HockeyPlayer.get_greeting()) # Привет, хоккеист!
player = HockeyPlayer()
print(player.get_greeting()) # Привет, хоккеист!
Привет, хоккеист!
Привет, хоккеист!

Всё вместе: маленькая программа

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

class HockeyPlayer:
default_position = 'Forward' # общее значение

def __init__(self, name, surname, age, team):
self.name = name
self.surname = surname
self.age = age
self.team = team

@classmethod
def get_default_position(cls):
return cls.default_position

@staticmethod
def get_greeting():
return 'Привет, хоккеист!'

def get_full_name(self):
return f'{self.name} {self.surname}'


print(HockeyPlayer.get_greeting()) # Привет, хоккеист!
print(HockeyPlayer.get_default_position()) # Forward

player = HockeyPlayer('Иван', 'Иванов', 17, 'Метеор')
captain = HockeyPlayer('Павел', 'Петров', 20, 'Вымпел')

print(player.get_full_name()) # Иван Иванов
print(captain.get_full_name()) # Павел Петров

HockeyPlayer.default_position = 'Goalkeeper' # меняем общее
print(player.get_default_position()) # Goalkeeper
print(captain.get_default_position()) # Goalkeeper
Привет, хоккеист!
Forward
Иван Иванов
Павел Петров
Goalkeeper
Goalkeeper