Функции внутри классов: как создавать и использовать методы объектов

Раздел: Python -> Объектно-ориентированное программирование

Основы методов объектов в 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())  # AttributeError

Class 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.

- Python имя метода (имя метода в python)
- Python print self (использование self в print python)
- метод remove python (метод remove в python)

Расширенные примеры методов объектов

Метод с переменным числом аргументов

Пример
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     # если раскомментировать - удалит _side
16
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, позволяя вызывать методы последовательно в одной строке.

Методы объектов в Python - comments

En
метод объекта python (python)