Ответ
Основное различие заключается в том, кому принадлежит атрибут и как он используется: атрибуты класса являются общими для всех экземпляров, а атрибуты экземпляра — уникальными для каждого.
Атрибут класса (Class Attribute)
Принадлежит самому классу. Его значение общее для всех экземпляров этого класса. Обычно определяется непосредственно в теле класса.
Используется для:
- Хранения констант, связанных с классом (
PI = 3.14
). - Хранения данных, общих для всех экземпляров (например, счетчик созданных объектов).
- Задания значений по умолчанию.
Атрибут экземпляра (Instance Attribute)
Принадлежит конкретному экземпляру (объекту). Его значение уникально для каждого экземпляра. Определяется, как правило, в методе __init__
с использованием self
.
Используется для:
- Хранения уникального состояния каждого объекта (
user.name
,user.email
).
Пример
class Dog:
# Атрибут класса: общий для всех собак
species = "Canis familiaris"
def __init__(self, name, age):
# Атрибуты экземпляра: уникальны для каждой собаки
self.name = name
self.age = age
# Создаем два экземпляра
dog1 = Dog("Buddy", 3)
dog2 = Dog("Lucy", 5)
# Доступ к атрибутам экземпляра
print(f"{dog1.name} is {dog1.age} years old.") # Buddy is 3 years old.
print(f"{dog2.name} is {dog2.age} years old.") # Lucy is 5 years old.
# Доступ к атрибуту класса (можно через класс или экземпляр)
print(f"{dog1.name} is a {dog1.species}.") # Buddy is a Canis familiaris.
print(f"All dogs are of species {Dog.species}.") # All dogs are of species Canis familiaris.
# Изменение атрибута класса влияет на все экземпляры
Dog.species = "A good boy"
print(f"{dog2.name} is now considered {dog2.species}.") # Lucy is now considered A good boy.