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

Что такое экземпляр класса?

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

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

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

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

Экземпляр класса в Python (объект)

Экземпляр класса — это конкретный объект, созданный на основе класса. Класс — это шаблон, а экземпляр — это реальный объект с конкретными данными.

Класс vs Экземпляр

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

# КЛАСС — это шаблон
class Dog:
    def __init__(self, name, age):
        self.name = name
        self.age = age
    
    def bark(self):
        return f"{self.name} says: Woof!"

# ЭКЗЕМПЛЯРЫ — конкретные объекты
dog1 = Dog("Buddy", 5)
dog2 = Dog("Max", 3)
dog3 = Dog("Luna", 2)

print(dog1.bark())  # Buddy says: Woof!
print(dog2.bark())  # Max says: Woof!
print(dog3.bark())  # Luna says: Woof!

# Разные экземпляры, одинаковый класс
print(type(dog1))  # <class '__main__.Dog'>
print(type(dog2))  # <class '__main__.Dog'>
print(type(dog3))  # <class '__main__.Dog'>

Создание экземпляра

Экземпляр создается вызовом класса как функции:

class Car:
    def __init__(self, brand, model):
        self.brand = brand
        self.model = model
        self.speed = 0
    
    def accelerate(self):
        self.speed += 10
        return f"{self.brand} {self.model} accelerates to {self.speed} km/h"

# Создание экземпляра
# 1. Python создает новый пустой объект
# 2. Вызывает __init__ со аргументами
# 3. Возвращает заполненный объект
my_car = Car("Toyota", "Camry")

print(my_car.brand)    # Toyota
print(my_car.model)    # Camry
print(my_car.speed)    # 0
print(my_car.accelerate())  # Toyota Camry accelerates to 10 km/h

Атрибуты экземпляра (instance attributes)

Каждый экземпляр имеет собственные данные:

class Person:
    def __init__(self, name, age):
        # Атрибуты экземпляра — это переменные, уникальные для каждого объекта
        self.name = name
        self.age = age
        self.email = None

person1 = Person("John", 30)
person2 = Person("Jane", 25)

# Разные данные в разных экземплярах
print(person1.name, person1.age)  # John 30
print(person2.name, person2.age)  # Jane 25

# Изменение в одном не влияет на другой
person1.age = 31
print(person1.age)  # 31
print(person2.age)  # 25 (не изменился)

Методы экземпляра (instance methods)

Методы работают с данными конкретного экземпляра:

class BankAccount:
    def __init__(self, owner, balance=0):
        self.owner = owner
        self.balance = balance
    
    # Метод экземпляра — имеет self как первый параметр
    def deposit(self, amount):
        self.balance += amount
        return f"{self.owner} deposited {amount}. New balance: {self.balance}"
    
    def withdraw(self, amount):
        if amount <= self.balance:
            self.balance -= amount
            return f"Withdrew {amount}. Remaining: {self.balance}"
        return "Insufficient funds"

# Создаем экземпляры
acc1 = BankAccount("Alice", 1000)
acc2 = BankAccount("Bob", 500)

# Каждый экземпляр имеет свое состояние
print(acc1.deposit(200))    # Alice deposited 200. New balance: 1200
print(acc2.deposit(100))    # Bob deposited 100. New balance: 600
print(acc1.balance)          # 1200
print(acc2.balance)          # 600

Переменные класса vs экземпляра

class Counter:
    # Переменная класса — одна для всех экземпляров
    total_count = 0
    
    def __init__(self, name):
        # Переменная экземпляра — уникальна для каждого объекта
        self.name = name
        Counter.total_count += 1

c1 = Counter("First")
c2 = Counter("Second")
c3 = Counter("Third")

# Переменная экземпляра: разные значения
print(c1.name)  # First
print(c2.name)  # Second
print(c3.name)  # Third

# Переменная класса: одна для всех
print(Counter.total_count)  # 3
print(c1.total_count)        # 3 (обращение через экземпляр тоже работает)
print(c2.total_count)        # 3

Проверка, является ли объект экземпляром класса

class Animal:
    pass

class Dog(Animal):
    pass

dog = Dog()

# isinstance проверяет, является ли объект экземпляром класса
print(isinstance(dog, Dog))     # True
print(isinstance(dog, Animal))  # True (наследование)
print(isinstance(dog, str))     # False

# type проверяет точный класс
print(type(dog) is Dog)         # True
print(type(dog) is Animal)      # False

init и создание экземпляров

class Product:
    def __init__(self, name, price, stock=0):
        # Инициализация экземпляра
        self.name = name
        self.price = price
        self.stock = stock
        self.created_at = None
    
    def __repr__(self):
        # Представление экземпляра в виде строки
        return f"Product('{self.name}', ${self.price}, {self.stock} in stock)"

# Создание экземпляров
product1 = Product("Laptop", 999.99, 5)
product2 = Product("Mouse", 29.99)  # stock не указан, используется 0

print(product1)  # Product('Laptop', $999.99, 5 in stock)
print(product2)  # Product('Mouse', $29.99, 0 in stock)

Изменение атрибутов экземпляра

class Student:
    def __init__(self, name, gpa=0.0):
        self.name = name
        self.gpa = gpa

student = Student("John", 3.5)

# Изменение существующего атрибута
student.gpa = 3.8
print(student.gpa)  # 3.8

# Добавление нового атрибута (Python позволяет!)
student.email = "john@university.edu"
print(student.email)  # john@university.edu

# Удаление атрибута
del student.gpa
print(hasattr(student, 'gpa'))  # False

Реальный пример: ORM модель (Django/SQLAlchemy)

from sqlalchemy import Column, Integer, String, DateTime
from sqlalchemy.ext.declarative import declarative_base
from datetime import datetime

Base = declarative_base()

class User(Base):
    __tablename__ = 'users'
    
    id = Column(Integer, primary_key=True)
    username = Column(String, unique=True)
    email = Column(String)
    created_at = Column(DateTime, default=datetime.now)
    
    def __repr__(self):
        return f"<User(username='{self.username}', email='{self.email}')>"

# Создание экземпляров
user1 = User(username="john_doe", email="john@example.com")
user2 = User(username="jane_doe", email="jane@example.com")

# Каждый экземпляр — это объект из БД
print(user1)  # <User(username='john_doe', email='john@example.com')>
print(user2)  # <User(username='jane_doe', email='jane@example.com')>

# Сессия сохранит их в БД
session.add(user1)
session.add(user2)
session.commit()

Важные концепции

1. id(объект) — уникальный идентификатор в памяти

obj1 = Dog("Buddy")
obj2 = Dog("Buddy")  # Другой объект, другие данные в памяти

print(id(obj1))  # 140234567891234
print(id(obj2))  # 140234567891235
# Разные объекты, хотя имеют одинаковые имена

2. == vs is

obj1 = [1, 2, 3]
obj2 = [1, 2, 3]

print(obj1 == obj2)   # True (равные значения)
print(obj1 is obj2)   # False (разные объекты в памяти)

3. Правильное использование экземпляров

# ПРАВИЛЬНО: использование экземпляров для разных данных
student1 = Student("Alice")
student2 = Student("Bob")
student3 = Student("Charlie")

# НЕПРАВИЛЬНО: один объект для разных данных
data = {"name": "Alice"}  # Просто словарь, не гибко

Вывод

Экземпляр класса — это объект с конкретными данными. Основные моменты:

  • Класс = шаблон, экземпляр = конкретный объект
  • Каждый экземпляр имеет собственные атрибуты
  • Методы работают с данными конкретного экземпляра
  • Использование экземпляров делает код модульным и переиспользуемым
  • В Python всё — объект, всё — экземпляр какого-то класса
Что такое экземпляр класса? | PrepBro