Комментарии (1)
Ответ сгенерирован нейросетью и может содержать ошибки
Что такое self
self — это первый параметр метода класса в Python, который ссылается на сам объект экземпляра класса. Это параметр, через который метод может получить доступ к атрибутам и другим методам конкретного экземпляра.
Основные моменты
self — не ключевое слово, это просто соглашение и параметр функции. Его можно назвать иначе (например, obj или instance), но это считается плохой практикой и наносит ущерб читаемости кода.
Как это работает
class Dog:
def __init__(self, name):
self.name = name # self ссылается на конкретный экземпляр
def bark(self):
print(f"{self.name} говорит: Гав!")
# Создание экземпляра
dog1 = Dog("Шарик")
dog2 = Dog("Бобик")
# Вызов метода
dog1.bark() # Шарик говорит: Гав!
dog2.bark() # Бобик говорит: Гав!
Когда мы вызываем dog1.bark(), Python автоматически передаёт dog1 как первый аргумент (self) в метод bark(). То есть это эквивалентно:
dog1.bark() # Python преобразует в:
Dog.bark(dog1) # явная передача экземпляра
self и атрибуты экземпляра
class Person:
species = "Человек" # атрибут класса — общий для всех
def __init__(self, name, age):
self.name = name # атрибут экземпляра — уникален для каждого
self.age = age
def get_info(self):
return f"{self.name}, {self.age} лет, вид: {self.species}"
person1 = Person("Иван", 30)
person2 = Person("Мария", 25)
print(person1.get_info()) # Иван, 30 лет, вид: Человек
print(person2.get_info()) # Мария, 25 лет, вид: Человек
self в особых методах
init (конструктор)
class Car:
def __init__(self, brand):
self.brand = brand # инициализация атрибутов
str и repr
class Point:
def __init__(self, x, y):
self.x = x
self.y = y
def __str__(self):
return f"Point({self.x}, {self.y})"
Методы доступа (getters/setters)
class Temperature:
def __init__(self, celsius):
self._celsius = celsius
@property
def fahrenheit(self):
return self._celsius * 9/5 + 32
Отличие от class методов и static методов
class Example:
class_var = "класс"
def instance_method(self):
# self — экземпляр, может менять self.attr
return f"Метод экземпляра: {self.class_var}"
@classmethod
def class_method(cls):
# cls — сам класс, может менять cls.class_var
return f"Метод класса: {cls.class_var}"
@staticmethod
def static_method():
# нет ни self, ни cls — это просто функция
return "Статический метод"
ex = Example()
print(ex.instance_method()) # Метод экземпляра: класс
print(Example.class_method()) # Метод класса: класс
print(Example.static_method()) # Статический метод
Почему self нужен
- Различие состояния: каждый экземпляр имеет свои данные
- Доступ к атрибутам: методы могут читать/изменять данные объекта
- Инкапсуляция: методы работают с приватными и защищённными атрибутами
- Полиморфизм: разные экземпляры вызывают переопределённые методы
Частые ошибки
# ❌ Забыли self в методе
class Bad:
def method():
print("Ошибка!")
# ✅ Правильно
class Good:
def method(self):
print("Правильно!")
# ❌ Вызов без экземпляра в обычном методе
Class.method() # TypeError: method() missing 1 required positional argument: self
# ✅ Вызов с экземпляром
obj = Class()
obj.method() # Работает
self — фундаментальная концепция объектно-ориентированного программирования в Python, которая обеспечивает связь между методом и его объектом.