Этот урок посвящен одной из ключевых концепций объектно-ориентированного программирования (ООП) в Python — атрибутам экземпляра. Классы — это чертежи, а экземпляры (объекты) — это конкретные реализации этих чертежей. Чтобы объекты могли хранить данные (состояние), мы используем атрибуты.
В этом уроке вы узнаете:
- Как объявлять атрибуты внутри специального метода __init__.
- Зачем нужно ключевое слово
selfи как оно связывает данные с конкретным объектом. - Как получать доступ к атрибутам и изменять их значения.
- Почему изменение атрибута в одном объекте не влияет на другие объекты того же класса.
Мы пройдем путь от создания простейшего класса с одним полем до работы с множеством независимых объектов. Будьте внимательны к синтаксису: в Python отступы и ключевое слово self играют решающую роль!
- Модуль 1: Основы синтаксиса Python
- Модуль 2: Переменные и типы данных
- Модуль 3: Операторы
- Арифметические операторы (+, -, *, /).
- Целочисленное деление и остаток (// и %).
- Возведение в степень (**).
- Операторы сравнения.
- Логические операторы (and, or, not).
- Операторы присваивания (=, +=, -=).
- Операторы принадлежности (in, not in).
- Операторы идентичности (is, is not).
- Битовые операторы.
- Тернарный оператор.
- Модуль 4: Ввод и вывод данных
- Модуль 5: Условные конструкции
- Модуль 6: Циклы
- Модуль 7: Строки
- Модуль 8: Списки
- Модуль 9: Кортежи
- Модуль 10: Словари
- Модуль 11: Множества
- Модуль 12: Функции
- Модуль 13: Встроенные функции
- Модуль 14: Работа с файлами
- Модуль 15: Обработка исключений
- Модуль 16: Модули и пакеты
- Модуль 17: ООП - Основы
- Создание классов.
- Атрибуты класса.
- Метод __init__().
- Атрибуты экземпляра.
- Модуль 18: ООП - Продвинутый уровень
- Модуль 19: Декораторы
- Модуль 20: Генераторы и итераторы
- Модуль 21: Регулярные выражения
- Модуль 22: Дата и время
- Модуль 23: Математические операции
- Модуль 24: Работа с сетью
- Модуль 25: Асинхронное программирование
- Модуль 26: Многопоточность
- Модуль 27: Тестирование
- Модуль 28: Базы данных
- Модуль 29: Алгоритмы и структуры данных
- Модуль 30: Продвинутые возможности
Первое знакомство с атрибутами
Перед вами простой класс Cat. Метод __init__ создает атрибут name для каждого нового кота. Проанализируйте код и определите, что будет выведено на экран.
class Cat:
def __init__(self, name):
self.name = name
my_cat = Cat("Barsik")
print(my_cat.name)Инициализация атрибута
Допишите код класса Car. Необходимо, чтобы метод __init__ принимал цвет автомобиля и сохранял его в атрибут экземпляра color.
class Car:
def __init__(self, color):
input1S.color = input2S
auto = Car("Red")
print(auto.color)Потерянный self
Программист хотел сохранить имя игрока в атрибут, но допустил ошибку, из-за которой атрибут не создается, а создается лишь локальная переменная. Найдите и исправьте строку с ошибкой.
class Player: def __init__(self, nickname): nickname = nicknamep1 = Player("ProGamer")print(p1.nickname)Сборка класса с атрибутом по умолчанию
Соберите код, который создает класс Counter. При инициализации у счетчика должен создаваться атрибут count, равный 0 (значение по умолчанию, аргументы для этого не нужны). Затем создайте объект и выведите его счетчик.
self.count = 0class Counter: def __init__(self):c = Counter()print(c.count)self.count = count def __init__(self, count):Атрибут или Локальная переменная?
Распределите строки кода по категориям. Одни относятся к созданию/изменению атрибута экземпляра (который "живет" вместе с объектом), другие — к обычным локальным переменным или аргументам.
self.age = 25total = 100user.name = "Alice"def __init__(self, value):result = a + bself.is_active = TrueЗаполнение профиля пользователя
Допишите класс User так, чтобы при создании объекта сохранялись login и role. Обратите внимание, что порядок аргументов при создании объекта важен.
class User:
def __init__(self, login, role):
self.login = input1S
input2S.role = input3S
u = User("admin", "superuser")
print(u.login, u.role)Создание и изменение атрибута
Восстановите логическую цепочку: объявление класса, создание объекта, вывод начального значения атрибута, изменение атрибута и вывод нового значения.
point.x = 10print(point.x) # Выведет 5class Point:point = Point() def __init__(self): self.x = 5print(point.x) # Выведет 10Независимость объектов
У нас есть класс Box, который хранит объем volume. Мы создали два ящика: b1 и b2. Сопоставьте код операции с результатом её выполнения, учитывая, что объекты независимы друг от друга.
b1 = Box(10); print(b1.volume)b2 = Box(5); print(b2.volume)b1.volume = 20; print(b2.volume)Вычисления с атрибутами
Изучите код класса Wallet (Кошелек). Мы создаем кошелек, тратим часть денег, а затем добавляем. Какая сумма окажется в атрибуте money в конце? Введите число.
class Wallet:
def __init__(self, amount):
self.money = amount
my_wallet = Wallet(100)
my_wallet.money -= 30
my_wallet.money += 50
print(my_wallet.money)Динамическое создание атрибутов
В Python атрибуты можно добавлять объекту "на лету", даже если их не было в __init__. Добавьте объекту obj новый атрибут new_attr со значением 99 уже ПОСЛЕ создания объекта.
class Empty:
pass
obj = Empty()
input1S.input2S = 99
print(obj.new_attr)