Ответ
Основное различие заключается в их области видимости и жизненном цикле.
- Переменная класса (Class Variable): Принадлежит самому классу. Существует в единственном экземпляре и является общей для всех объектов этого класса.
- Переменная экземпляра (Instance Variable): Принадлежит конкретному объекту (экземпляру) класса. У каждого объекта свой собственный набор таких переменных.
Пример:
class Dog:
# Переменная класса: общая для всех собак
species = "Canis familiaris"
def __init__(self, name):
# Переменная экземпляра: уникальна для каждой собаки
self.name = name
# Создаем два экземпляра
dog1 = Dog("Рекс")
dog2 = Dog("Шарик")
# Изменение переменной класса влияет на все экземпляры
print(f"Вид Рекса: {dog1.species}") # Вид Рекса: Canis familiaris
Dog.species = "Домашний волк"
print(f"Новый вид Шарика: {dog2.species}") # Новый вид Шарика: Домашний волк
# Изменение переменной экземпляра затрагивает только один объект
dog1.name = "Гром"
print(f"Новое имя dog1: {dog1.name}") # Новое имя dog1: Гром
print(f"Имя dog2 осталось прежним: {dog2.name}") # Имя dog2 осталось прежним: Шарик
Сводная таблица
| Характеристика | Переменная класса | Переменная экземпляра |
|---|---|---|
| Область видимости | Общая для всех экземпляров класса | Уникальна для каждого экземпляра |
| Определение | В теле класса, вне методов | Внутри методов (обычно __init__) через self |
| Хранение | В атрибуте __dict__ класса |
В атрибуте __dict__ экземпляра |
| Основное применение | Константы, счетчики, общие для всех атрибуты | Уникальные свойства и состояние каждого объекта |
Ответ 18+ 🔞
А, ну это же классика, блядь! Вечный вопрос, который у новичков мозг в труху превращает. Сейчас разжуём, как есть, без соплей.
Представь себе, что класс — это чертёж завода по производству собак, ёпта. А каждый объект — это конкретная живая псина, сбежавшая с этого завода.
Так вот, переменная класса — это, сука, какая-нибудь глобальная настройка на всём заводе. Типа, "вид: Canis familiaris". Она одна на всех, блядь! Написали на стене в цеху — и все новенькие пёсели с конвейера уже с этой бумажкой в зубах выезжают. Изменил надпись — и все, включая уже выпущенных, становятся "Домашними волками". Общая судьба, мать её!
А переменная экземпляра — это уже личные татухи каждой собаки. Имя, возраст, любимая косточка. Одна псина — Рекс, другая — Шарик. Рексу имя поменяли на "Гром" — так Шарик-то с какого перепугу меняться должен? У него своя жизнь, своя жопка чешется!
Вот смотри на код, тут всё как на ладони, блядь:
class Dog:
# Это вот она, общаковая, переменная класса. Как вывеска на проходной.
species = "Canis familiaris"
def __init__(self, name):
# А это личное дело каждой собаки. Каждому self. свой name.
self.name = name
# Штампуем двух ушастых.
dog1 = Dog("Рекс")
dog2 = Dog("Шарик")
# Меняем вывеску на заводе. Всем поголовно!
print(f"Вид Рекса: {dog1.species}") # Вид Рекса: Canis familiaris
Dog.species = "Домашний волк" # Ёбта, переименовали вид!
print(f"Новый вид Шарика: {dog2.species}") # Новый вид Шарика: Домашний волк. Шарик в шоке!
# А тут Рексу кличку сменили. Это его личное горе.
dog1.name = "Гром"
print(f"Новое имя dog1: {dog1.name}") # Новое имя dog1: Гром
print(f"Имя dog2 осталось прежним: {dog2.name}") # Имя dog2 осталось прежним: Шарик. Ему похуй!
Короче, таблица, чтобы вообще ни хуя не осталось непонятного
| Признак | Переменная класса (Общак) | Переменная экземпляра (Личное) |
|---|---|---|
| Чей это? | Класса. Одна на всех, как общий унитаз. | Конкретного объекта. У каждого свой горшок. |
| Где объявляется? | Прямо в теле класса, как приказ сверху. | В методах (чаще в __init__), через self. |
| Где лежит? | В тайной комнатке класса (__dict__ класса). |
В рюкзаке объекта (__dict__ экземпляра). |
| Зачем нужно? | Для констант, счётчиков, общих для всех настроек. | Для хранения уникального состояния каждой твари. |
Вот и вся магия, блядь. Не усложняй. Общак — для всех. Личное — для себя. Главное — не перепутать, а то получится пиздец, когда у всех объектов вдруг одна жопа на всех окажется.