← Назад к вопросам

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

1.0 Junior🔥 111 комментариев
#Python Core

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI22 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Разница между объектом и экземпляром класса

Это фундаментальные концепции в объектно-ориентированном программировании. Часто эти термины используют как синонимы, но они имеют разные оттенки в зависимости от контекста.

Определения

Экземпляр класса (instance of a class):

  • Конкретное воплощение класса в памяти
  • Создаётся с помощью вызова конструктора класса
  • Имеет собственное состояние (атрибуты)
  • Каждый экземпляр занимает отдельное место в памяти

Объект (object):

  • В широком смысле: всё в Python является объектом (включая классы)
  • В узком смысле: экземпляр класса с поведением и состоянием
  • Может быть экземпляром любого класса, не только пользовательского

Теоретическое различие

class User:
    """Класс — это шаблон"""
    def __init__(self, name: str):
        self.name = name

# Класс сам по себе
print(type(User))  # <class 'type'> — User является объектом типа 'type'

# Экземпляр класса
john = User("John")
print(type(john))  # <class '__main__.User'> — john является экземпляром User

# И john — это тоже объект, но это объект типа User
print(isinstance(john, object))  # True — всё в Python объект
print(isinstance(User, object))  # True — даже классы объекты

Простая аналогия:

  • Класс — это чертёж дома
  • Экземпляр класса — это построенный дом на улице
  • Объект — обобщающий термин для всего, что имеет состояние и поведение

Практическое различие

# Класс — это тип
class Car:
    def __init__(self, brand: str, color: str):
        self.brand = brand
        self.color = color
    
    def drive(self):
        return f"Driving a {self.color} {self.brand}"

# Экземпляры — конкретные объекты
car1 = Car("Toyota", "red")
car2 = Car("BMW", "blue")
car3 = Car("Toyota", "red")  # Ещё один экземпляр, но другой объект в памяти

# Проверяем
print(car1 is car2)  # False — разные объекты в памяти
print(car1.drive())  # "Driving a red Toyota"
print(car2.drive())  # "Driving a blue BMW"

# Но все они экземпляры одного класса
print(isinstance(car1, Car))  # True
print(isinstance(car2, Car))  # True
print(isinstance(car3, Car))  # True

# И всё это объекты
print(isinstance(car1, object))  # True
print(isinstance(Car, object))   # True (даже класс объект)

В контексте памяти

class Point:
    def __init__(self, x: int, y: int):
        self.x = x
        self.y = y

# Класс — существует один раз
print(id(Point))  # 140734523451234 — одно место в памяти

# Экземпляры — каждый в своём месте памяти
p1 = Point(1, 2)
p2 = Point(1, 2)

print(id(p1))  # 140734523451300 — своё место
print(id(p2))  # 140734523451456 — другое место
print(p1 == p2)  # False (разные объекты по умолчанию)
print(p1 is p2)  # False (точно разные)

Все в Python — объекты

Важно помнить: в Python всё является объектом.

# Строки — объекты
text = "Hello"  # Объект типа str
print(type(text))  # <class 'str'>
print(isinstance(text, object))  # True

# Числа — объекты
num = 42  # Объект типа int
print(type(num))  # <class 'int'>
print(isinstance(num, object))  # True

# Функции — объекты
def my_func():
    pass

print(type(my_func))  # <class 'function'>
print(isinstance(my_func, object))  # True

# Классы — объекты типа 'type'
class MyClass:
    pass

print(type(MyClass))  # <class 'type'>
print(isinstance(MyClass, object))  # True

# Объекты (экземпляры классов)
obj = MyClass()
print(type(obj))  # <class '__main__.MyClass'>
print(isinstance(obj, object))  # True

Иерархия

Все в Python наследует от базового класса object:

class Animal:
    pass  # Неявно наследует от object

class Dog(Animal):
    pass

dog = Dog()

# Проверяем MRO (Method Resolution Order)
print(Dog.__mro__)
# (<class 'Dog'>, <class 'Animal'>, <class 'object'>)

# dog — экземпляр Dog
# dog — объект (всё объект)
# Dog — класс (и он тоже объект типа 'type')
# object — базовый класс для всего

Когда это важно

1. При проверке типов

class Document:
    pass

doc = Document()  # doc — это экземпляр класса Document

# Проверяем экземпляр
if isinstance(doc, Document):  # ✅ True — это экземпляр Document
    print("It's an instance of Document")

# Проверяем класс
if isinstance(Document, type):  # ✅ True — это класс
    print("Document is a class")

# Проверяем, что это объект
if isinstance(doc, object):  # ✅ True — всё объект
    print("Everything is an object in Python")

2. При работе с рефлексией

class Book:
    title = "Unknown"
    
    def __init__(self, title: str):
        self.title = title

book = Book("Python Guide")  # book — экземпляр

# Доступ к методам класса через экземпляр
print(book.__class__)  # <class '__main__.Book'> — класс экземпляра
print(book.__class__.__name__)  # 'Book' — имя класса

# Все методы и атрибуты класса доступны через экземпляр
print(hasattr(book, 'title'))  # True
print(type(book.title))  # <class 'str'> — тип атрибута

3. При работе с метаклассами

class Meta(type):
    """Метаклассы создают классы"""
    pass

class MyClass(metaclass=Meta):
    pass

# MyClass — объект (экземпляр Meta)
print(isinstance(MyClass, Meta))  # True
print(type(MyClass))  # <class '__main__.Meta'>

# obj — объект (экземпляр MyClass)
obj = MyClass()
print(isinstance(obj, MyClass))  # True
print(type(obj))  # <class '__main__.MyClass'>

Сравнение в таблице

АспектКлассЭкземплярОбъект
Что этоШаблон, типКонкретное значениеОбщий термин
СозданиеОпределение classВызов конструктораАвтоматическое в Python
КоличествоОдин на много экземпляровМожет быть многоВсё считается объектом
ПамятьОдно местоКаждый в своём местеНа всё указывает
Примерclass Carcar1 = Car()42, "text", car1
type()<class 'type'><class 'main.Car'>Зависит от значения
isinstance(x, object)TrueTrueTrue для всего

Практический пример

class BankAccount:
    def __init__(self, owner: str, balance: float):
        self.owner = owner
        self.balance = balance
    
    def deposit(self, amount: float):
        self.balance += amount

# Класс — существует один
print(f"Класс: {BankAccount}")
print(f"Тип класса: {type(BankAccount)}")

# Экземпляры — много разных
john_account = BankAccount("John", 1000)  # Экземпляр 1
jane_account = BankAccount("Jane", 2000)  # Экземпляр 2

print(f"\nExinstance 1 (john): {john_account}")
print(f"Instance 2 (jane): {jane_account}")
print(f"Разные ли объекты в памяти? {john_account is not jane_account}")  # True

# Всё это объекты
print(f"\nОсе объекты? {isinstance(BankAccount, object) and isinstance(john_account, object)}")  # True

# john_account — это экземпляр BankAccount
print(f"john_account — экземпляр BankAccount? {isinstance(john_account, BankAccount)}")  # True

Вывод

  • Класс — это шаблон для создания объектов
  • Экземпляр класса — конкретный объект, созданный из этого шаблона
  • Объект — общий термин для всего в Python, включая классы, экземпляры, функции, числа и т.д.

В практическом коде часто говорят просто "объект", подразумевая экземпляр класса, но в теории и документации различие важно.

В чем разница между объектом и экземпляром класса? | PrepBro