Ответ
Атрибут класса в Python — это переменная, которая объявляется непосредственно внутри тела класса, но вне каких-либо методов. Он принадлежит самому классу, а не его отдельным экземплярам, и является общим для всех объектов этого класса.
Почему используется:
- Для хранения данных, которые должны быть одинаковыми для всех экземпляров класса (например, константы).
- Для отслеживания состояния, общего для всех экземпляров (например, счетчик созданных объектов).
Пример:
class Car:
wheels = 4 # Это атрибут класса: общий для всех Car
_total_cars_created = 0 # Пример использования для общего состояния
def __init__(self, color: str):
self.color = color # Это атрибут экземпляра: уникален для каждого Car
Car._total_cars_created += 1 # Увеличиваем счетчик при создании экземпляра
@classmethod
def get_total_cars(cls) -> int:
return cls._total_cars_created
# Доступ к атрибуту класса через сам класс
print(f"Количество колес у Car (через класс): {Car.wheels}") # Вывод: 4
# Создание экземпляров
bmw = Car("black")
audi = Car("silver")
# Доступ к атрибуту класса через экземпляр
print(f"Количество колес у bmw (через экземпляр): {bmw.wheels}") # Вывод: 4
print(f"Количество колес у audi (через экземпляр): {audi.wheels}") # Вывод: 4
# Изменение атрибута класса через класс
Car.wheels = 6
print(f"Новое количество колес у Car (через класс): {Car.wheels}") # Вывод: 6
print(f"Количество колес у bmw после изменения класса: {bmw.wheels}") # Вывод: 6
# Попытка изменить атрибут класса через экземпляр создает атрибут экземпляра
bmw.wheels = 3 # Теперь у bmw есть свой атрибут 'wheels'
print(f"Количество колес у bmw (после изменения через экземпляр): {bmw.wheels}") # Вывод: 3
print(f"Количество колес у audi (не изменилось): {audi.wheels}") # Вывод: 6
print(f"Количество колес у Car (не изменилось): {Car.wheels}") # Вывод: 6
print(f"Всего создано машин: {Car.get_total_cars()}") # Вывод: 2
Важные нюансы:
- Изменение атрибута класса через сам класс (
Car.wheels = 6) влияет на все экземпляры, которые не имеют собственного атрибута с таким же именем. - Присвоение значения атрибуту с тем же именем через экземпляр (
bmw.wheels = 3) создает новый атрибут экземпляра, который "затеняет" атрибут класса для данного конкретного экземпляра. Атрибут класса при этом не изменяется.