В Python можно выделить три основных типа методов, которые могут быть реализованы внутри класса:
Рассмотрим каждый тип методов подробно, с примерами.
Методы экземпляра являются наиболее распространёнными в Python. Эти методы привязаны к конкретному экземпляру класса и могут взаимодействовать с его данными. Чтобы метод был привязан к экземпляру, первым аргументом метода всегда передаётся сам экземпляр, традиционно обозначаемый как self
.
class Example:
def instance_hello(self):
print(f'Hello from {self}')
Создадим экземпляр класса Example
и вызовем метод:
example = Example()
example.instance_hello() # Вывод: Hello from <__main__.Example object at 0x...>
В этом примере метод instance_hello
принимает экземпляр класса self
и выводит сообщение. Он работает только от экземпляра класса.
class Person:
def __init__(self, name, age):
self.name = name
self.age = age
def introduce(self):
print(f'My name is {self.name}, and I am {self.age} years old.')
Создадим экземпляр класса Person
:
john = Person("John", 25)
john.introduce() # Вывод: My name is John, and I am 25 years old.
В этом примере метод экземпляра introduce
работает с атрибутами экземпляра, используя self
.
Методы класса не привязаны к экземпляру, а привязаны непосредственно к самому классу. Для их создания используется декоратор @classmethod
. В качестве первого аргумента такой метод получает не экземпляр, а класс, который передаётся как cls
.
class Example:
@classmethod
def class_hello(cls):
print(f'Hello from the class {cls}')
Теперь мы можем вызвать этот метод как через класс, так и через экземпляр:
Example.class_hello() # Вывод: Hello from the class <class '__main__.Example'>
example = Example()
example.class_hello() # Вывод: Hello from the class <class '__main__.Example'>
Метод класса всегда будет работать с самим классом, даже если вызван от экземпляра.
Фабричные методы создают новые экземпляры класса. Они особенно полезны, если создание объектов требует особой логики.
class Car:
def __init__(self, color, model):
self.color = color
self.model = model
@classmethod
def create_red_tesla(cls):
return cls('Red', 'Tesla')
car = Car.create_red_tesla()
print(car.color, car.model) # Вывод: Red Tesla
Здесь метод create_red_tesla
создаёт и возвращает новый экземпляр класса Car
.
Статические методы не принимают ни self
, ни cls
. Они не привязаны ни к экземпляру, ни к классу и обычно служат для выполнения вспомогательных задач, связанных с классом.
class MathOperations:
@staticmethod
def add(a, b):
return a + b
result = MathOperations.add(5, 3)
print(result) # Вывод: 8
Статический метод можно вызывать как от самого класса, так и от экземпляра, однако не имеет доступа ни к атрибутам экземпляра, ни к атрибутам класса.
class TemperatureConverter:
@staticmethod
def celsius_to_fahrenheit(celsius):
return celsius * 9/5 + 32
@staticmethod
def fahrenheit_to_celsius(fahrenheit):
return (fahrenheit - 32) * 5/9
Теперь вы можете использовать этот класс для преобразования температур:
print(TemperatureConverter.celsius_to_fahrenheit(0)) # Вывод: 32.0
print(TemperatureConverter.fahrenheit_to_celsius(32)) # Вывод: 0.0
Иногда может возникнуть необходимость комбинировать методы разных типов в одном классе. Например, можно использовать методы класса для управления общим состоянием класса, а методы экземпляра для работы с конкретными объектами.
class Library:
total_books = 0
def __init__(self, name):
self.name = name
self.books = 0
def add_book(self):
self.books += 1
Library.total_books += 1
@classmethod
def total_books_in_all_libraries(cls):
print(f'Total books in all libraries: {cls.total_books}')
Здесь метод экземпляра add_book
изменяет как состояние конкретной библиотеки, так и общее состояние всех библиотек через атрибут класса. Метод класса total_books_in_all_libraries
работает с общим состоянием класса:
library1 = Library("City Library")
library2 = Library("University Library")
library1.add_book()
library1.add_book()
library2.add_book()
Library.total_books_in_all_libraries() # Вывод: Total books in all libraries: 3
class Circle:
PI = 3.14159
def __init__(self, radius):
self.radius = radius
def area(self):
return Circle.PI * (self.radius ** 2)
@classmethod
def circle_from_diameter(cls, diameter):
radius = diameter / 2
return cls(radius)
@staticmethod
def format_area(area):
return f'The area is: {area:.2f} square units'
Здесь:
circle_from_diameter
создаёт новый объект Circle
на основе диаметра.format_area
форматирует площадь.Пример использования:
circle = Circle.circle_from_diameter(10)
area = circle.area()
print(Circle.format_area(area)) # Вывод: The area is: 78.54 square units
Тип метода | Привязан к | Первый аргумент | Вызов от | Доступ к атрибутам |
---|---|---|---|---|
Метод экземпляра | Экземпляру класса | self | Экземпляра | Через self доступ к экземпляру и классу |
Метод класса | Классу | cls | Класса и экземпляра | Через cls доступ к атрибутам класса |
Статический метод | Не привязан ни к чему | Нет обязательных аргументов | Класса и экземпляра | Нет доступа к атрибутам экземпляра или класса |
Мы рассмотрели три типа методов, которые можно использовать в Python: методы экземпляра, методы класса и статические методы. Методы экземпляра используются для работы с конкретными объектами, методы класса — для работы с классом в целом, а статические методы — для выполнения вспомогательных задач, не привязанных ни к экземплярам, ни к классу.