В чем разница между атрибутами класса и атрибутами экземпляра в Python?

Ответ

Основное различие заключается в том, кому принадлежит атрибут и как он используется: атрибуты класса являются общими для всех экземпляров, а атрибуты экземпляра — уникальными для каждого.

Атрибут класса (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.