Методы: экземпляра, класса и статические
Метод — это функция внутри класса. В 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