Функции внутри классов: как создавать и использовать методы объектов
Основы методов объектов в Python
Наиболее эффективный способ определения методов объектов
Метод объекта (instance method) - это функция, определённая внутри класса и вызываемая для конкретного экземпляра. Первым аргументом всегда передаётся ссылка на сам объект self.
class User:
def __init__(self, name):
self.name = name
def greet(self):
return f'Привет, {self.name}!'атрибуты класса python (атрибуты классов и объектов в python)
Создание экземпляра и вызов метода:
user = User('Анна')
print(user.greet())библиотека классов python (библиотека классов в python)
Привет, Анна!
метод объекта python (методы объектов в python)
Объяснение: при вызове user.greet() интерпретатор автоматически передаёт user в параметр self. Метод может обращаться к атрибутам и другим методам объекта.
Как передать аргументы в метод объекта?
Метод может принимать дополнительные параметры после self.
class Calculator:
def add(self, a, b):
return a + b
calc = Calculator()
print(calc.add(5, 3))Python структура объекта (структура объекта в python)
8
Python создание объектов (создание объектов в python)
Типичная ошибка:
забыть указатьself в определении. Возникает TypeError: add() takes 2 positional arguments but 3 were given. Решение - всегда добавлять self первым параметром.Как вернуть значение из метода?
Метод может возвращать любое выражение с помощью return.
class Circle:
def __init__(self, radius):
self.radius = radius
def area(self):
return 3.14159 * self.radius ** 2
circle = Circle(5)
print(circle.area())Self object python (объект self в python)
78.53975
Object attribute python (атрибуты объекта в python)
Если return отсутствует, метод возвращает None.
Ошибка:
попытка присвоить результат вызова метода безreturn приводит к None, что может быть неочевидно.Как изменить атрибуты объекта из метода?
Метод может модифицировать состояние объекта через self.
class BankAccount:
def __init__(self, balance=0):
self.balance = balance
def deposit(self, amount):
self.balance += amount
return self.balance
account = BankAccount(100)
print(account.deposit(50))Python call method (вызов метода в python)
150
Python класс данных (класс данных в python)
Проблема:
если по ошибке присвоить значение новой локальной переменной, а не атрибуту (например,balance = amount), состояние объекта не изменится. Нужно явно писать self.balance.Как сделать приватный метод?
С помощью двойного подчёркивания __ в начале имени метод становится приватным (name mangling).
class Secret:
def __reveal(self):
return 'Секрет'
def public_method(self):
return self.__reveal()
obj = Secret()
print(obj.public_method())
# print(obj.__reveal()) # AttributeErrorClass method python (методы классов в python)
Секрет
Python object methods (методы объектов в python)
Прямой вызов obj.__reveal() вызывает AttributeError, но доступ возможен через obj._Secret__reveal().
Иллюзия приватности:
name mangling не делает метод полностью защищённым; в Python принято использовать одно подчёркивание_method как соглашение о защищённости.Когда использовать статические методы?
Статический метод (@staticmethod) не получает ни self, ни cls. Это обычная функция внутри класса для логической группировки.
class MathUtils:
@staticmethod
def factorial(n):
if n == 0:
return 1
return n * MathUtils.factorial(n-1)
print(MathUtils.factorial(5))класс python определение (определение классов в python)
120
Self method python (параметр self в методах python)
Вызывается как через класс, так и через экземпляр.
Ошибка:
если метод используетself или cls, но объявлен как @staticmethod, возникнет логическая ошибка - нужно пересмотреть необходимость self.Когда нужны методы класса?
Метод класса (@classmethod) получает ссылку на класс (cls) и может создавать экземпляры или изменять атрибуты класса.
class Person:
def __init__(self, name, age):
self.name = name
self.age = age
@classmethod
def from_birth_year(cls, name, birth_year):
return cls(name, 2025 - birth_year)
p = Person.from_birth_year('Иван', 1990)
print(p.age)приватные атрибуты python (приватные атрибуты в python)
35
создание типов python (создание пользовательских типов данных в python)
Метод класса можно вызывать на подклассах, возвращая экземпляр подкласса.
Ошибка:
если внутри метода класса использоватьself вместо cls - TypeError, так как self не определён.Как создать свойство, ведущее себя как атрибут?
Декоратор @property превращает метод в вычисляемое свойство только для чтения или с сеттером.
class Celsius:
def __init__(self, temperature):
self._temperature = temperature
@property
def fahrenheit(self):
return (self._temperature * 9/5) + 32
@fahrenheit.setter
def fahrenheit(self, value):
self._temperature = (value - 32) * 5/9
c = Celsius(0)
print(c.fahrenheit)
c.fahrenheit = 100
print(c._temperature)тип данных класса python (тип данных класса в python)
32.0 37.77777777777778
Свойства позволяют контролировать доступ и валидацию.
Ошибка:
попытка удалить свойство вызоветAttributeError, если не определён @.deleter .Расширенные примеры методов объектов
Метод с переменным числом аргументов
class Logger:
def log(self, *args, **kwargs):
for arg in args:
print(f'LOG: {arg}')
for key, value in kwargs.items():
print(f'LOG {key}: {value}')
def test_log():
l = Logger()
l.log('Error', 'Warning', status=404)
test_log()LOG: Error LOG: Warning LOG status: 404
Пояснение: *args собирает позиционные аргументы в кортеж, **kwargs - именованные в словарь. Метод может обрабатывать любое количество параметров.
Фабричный метод класса
class Pizza:
def __init__(self, ingredients):
self.ingredients = ingredients
@classmethod
def margherita(cls):
return cls(['mozzarella', 'tomato', 'basil'])
@classmethod
def pepperoni(cls):
return cls(['mozzarella', 'tomato', 'pepperoni'])
p = Pizza.margherita()
print(p.ingredients)['mozzarella', 'tomato', 'basil']
Пояснение: методы класса часто применяются для создания объектов с предустановленными параметрами. Они наследуются подклассами.
Свойство с геттером, сеттером и делитером
class Square:
def __init__(self, side):
self._side = side
@property
def area(self):
return self._side ** 2
@area.setter
def area(self, value):
self._side = value ** 0.5
@area.deleter
def area(self):
del self._side
s = Square(4)
print(s.area) # 16
s.area = 25
print(s._side) # 5.0
# del s.area # если раскомментировать - удалит _side16 5.0
Пояснение: полный набор аксессоров для вычисляемого атрибута.
Перегрузка оператора сложения
class Vector:
def __init__(self, x, y):
self.x = x
self.y = y
def __add__(self, other):
if isinstance(other, Vector):
return Vector(self.x + other.x, self.y + other.y)
return NotImplemented
def __repr__(self):
return f'Vector({self.x}, {self.y})'
v1 = Vector(2, 3)
v2 = Vector(1, 4)
v3 = v1 + v2
print(v3)Vector(3, 7)
Пояснение: специальный метод __add__ вызывается при использовании оператора +. Возврат NotImplemented позволяет Python попробовать обратный метод второго операнда.
Итератор с методами __iter__ и __next__
class Counter:
def __init__(self, limit):
self.limit = limit
self.current = 0
def __iter__(self):
return self
def __next__(self):
if self.current >= self.limit:
raise StopIteration
value = self.current
self.current += 1
return value
for num in Counter(3):
print(num)0 1 2
Пояснение: объект становится итератором, если определяет __iter__ (возвращает себя) и __next__ (возвращает следующий элемент или выбрасывает StopIteration).
Цепочка методов (fluent interface)
class TextProcessor:
def __init__(self, text):
self.text = text
def remove_punctuation(self):
import string
self.text = self.text.translate(str.maketrans('', '', string.punctuation))
return self
def to_upper(self):
self.text = self.text.upper()
return self
def get_result(self):
return self.text
result = TextProcessor('Hello, World!').remove_punctuation().to_upper().get_result()
print(result)HELLO WORLD
Пояснение: каждый метод возвращает self, позволяя вызывать методы последовательно в одной строке.