В этом модуле мы погрузимся в тему Атрибуты класса в объектно-ориентированном программировании на Python. Вы узнаете, чем переменные, объявленные внутри класса, отличаются от переменных экземпляра (self).
Мы разберем:
1. Как создавать атрибуты, общие для всех объектов класса.
2. Как обращаться к ним через имя класса и через экземпляр.
3. Что такое "затенение" (shadowing) атрибутов класса атрибутами экземпляра.
4. Особенности работы с изменяемыми типами данных (списками) в качестве атрибутов класса.
Атрибуты класса — мощный инструмент для хранения глобальных настроек, констант или счетчиков, общих для всех созданных объектов. Будьте внимательны к синтаксису и логике работы памяти!
- Модуль 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: Продвинутые возможности
1. Доступ к атрибуту класса
Посмотрите на код. Мы создали класс `SpaceShip` с атрибутом `fuel_type`. Что выведет функция `print`?
class SpaceShip:
fuel_type = "Plasma"
print(SpaceShip.fuel_type)2. Объявление и использование константы класса
Допишите код так, чтобы класс `Circle` имел атрибут `PI`, равный 3.14, и метод для расчета площади, использующий этот атрибут класса.
class Circle:
input1S = 3.14 # Атрибут класса
def __init__(self, radius):
self.radius = radius
def area(self):
return input2S * (self.radius ** 2)
c = Circle(10)
print(c.area())3. Где живут атрибуты?
Распределите строки кода по категориям: создают ли они атрибут класса или атрибут экземпляра.
class Robot: kind = 'Droid' def __init__(self, name): self.name = name self.battery = 100 version = 2.04. Исправьте ошибку доступа
Программа должна подсчитывать количество созданных пользователей. Однако, при попытке увеличить счетчик возникает ошибка. Найдите и исправьте строку, где происходит неправильное обращение к атрибуту класса внутри метода.
class User: total_count = 0 def __init__(self, name): self.name = name total_count += 15. Общий счетчик
Проанализируйте код. Мы создаем три экземпляра класса, каждый раз увеличивая переменную класса `counter`. Чему будет равно значение `A.counter` в конце? Введите число.
class A:
counter = 0
def __init__(self):
A.counter += 1
x = A()
y = A()
z = A()
print(A.counter)6. Затенение атрибутов (Shadowing)
Это задание демонстрирует важную концепцию. У нас есть атрибут класса `color`. Сначала мы читаем его через экземпляр. Затем мы присваиваем значение `self.color`. Разберитесь, что будет выведено. Обратите внимание: присваивание `self.var = ...` создает новый атрибут у экземпляра, не меняя класс!
class Car:
color = 'White'
my_car = Car()
print(input1S) # Выведет 'White' (берет у класса)
my_car.color = 'Red' # Создаем атрибут экземпляра!
print(input2S) # Выведет 'White' (оригинал в классе не изменился)
print(input3S) # Выведет 'Red' (новый атрибут экземпляра)7. Соберите класс с настройками
Соберите код, который определяет класс `Config` с атрибутом `admin_email`. Затем создайте функцию `send_alert`, которая использует этот email, если сообщение является критическим ('Critical').
class Config: admin_email = 'admin@site.com'def send_alert(msg, level): if level == 'Critical': print(f"Sending to {Config.admin_email}") else: print("Log only")Config.admin_email = 'support@site.com'print(self.admin_email)8. Ловушка изменяемых типов
Внимание! Это классическая ошибка новичков. Мы используем список (изменяемый тип) как атрибут класса.
Что выведет код для `b2.items` после того, как мы добавили элемент в `b1`?
class Box:
items = [] # Общий список для всех коробок!
b1 = Box()
b2 = Box()
b1.items.append('Apple')
print(b2.items)9. Влияние изменения атрибута класса
Восстановите хронологию выполнения кода. Мы меняем атрибут класса `rate` в середине программы. Посмотрите, как это влияет на результат вывода.
print(obj.rate) # Выведет 1.5obj.rate = 2.0 rate = 1.0print(obj.rate) # Выведет 1.0class Bank:Bank.rate = 1.5obj = Bank()