Python | Вопросы собесов
Cайт: easyoffer.ru Реклама: @easyoffer_adv ВП: @easyoffer_vp Тесты t.me/+20tRfhrwPpM4NDQy Задачи t.me/+nsl4meWmhfQwNDVi Вакансии t.me/+cXGKkrOY2-w3ZTky
نمایش بیشتر📈 تحلیل کانال تلگرام Python | Вопросы собесов
کانال Python | Вопросы собесов (@python_easy_ru) در بخش زبانی روسی بازیگری فعال است. در حال حاضر جامعه شامل 13 100 مشترک است و جایگاه 9 746 را در دسته فناوری و برنامهها و رتبه 50 691 را در منطقه روسيا دارد.
📊 شاخصهای مخاطب و پویایی
از زمان ایجاد در невідомо، پروژه رشد سریعی داشته و 13 100 مشترک جذب کرده است.
بر اساس آخرین دادهها در تاریخ 11 ژوئن, 2026، کانال فعالیت پایداری دارد. در ۳۰ روز گذشته تغییر اعضا برابر -60 و در ۲۴ ساعت گذشته برابر -4 بوده و همچنان دسترسی گستردهای حفظ شده است.
- وضعیت تأیید: تأیید نشده
- نرخ تعامل (ER): میانگین تعامل مخاطب 9.30% است و در ۲۴ ساعت نخست پس از انتشار، محتوا معمولاً 5.54% واکنش نسبت به کل مشترکان کسب میکند.
- دسترسی پستها: هر پست به طور میانگین 1 219 بازدید دریافت میکند. در اولین روز معمولاً 726 بازدید جمعآوری میشود.
- واکنشها و تعامل: مخاطبان بهطور فعال حمایت میکنند؛ میانگین واکنش به هر پست 3 است.
- علایق موضوعی: محتوا بر موضوعات کلیدی مانند ставь, модуль, строка, docker, alice تمرکز دارد.
📝 توضیح و سیاست محتوایی
نویسنده این فضا را محل بیان دیدگاههای شخصی توصیف میکند:
“Cайт: easyoffer.ru
Реклама: @easyoffer_adv
ВП: @easyoffer_vp
Тесты t.me/+20tRfhrwPpM4NDQy
Задачи t.me/+nsl4meWmhfQwNDVi
Вакансии t.me/+cXGKkrOY2-w3ZTky”
به لطف بهروزرسانیهای پرتکرار (آخرین داده در تاریخ 12 ژوئن, 2026)، کانال همواره بهروز و دارای دسترسی بالاست. تحلیلها نشان میدهد مخاطبان بهطور فعال با محتوا تعامل دارند و آن را به نقطه اثرگذاری مهم در دسته فناوری و برنامهها تبدیل کردهاند.
self, который представляет собой сам объект. Остальные параметры могут быть любыми и задаются при создании объекта.
Пример:
class Person:
def __init__(self, name, age):
self.name = name
self.age = age
# Создание экземпляра класса Person
person1 = Person("Alice", 30)
print(person1.name) # Выведет: Alice
print(person1.age) # Выведет: 30
Почему это так важно?
1️⃣Инициализация атрибутов: init позволяет задать начальные значения атрибутам объекта, что делает объект полнофункциональным сразу после создания.
2️⃣Гибкость: Можно задавать различные параметры при создании объекта, что позволяет создавать объекты с разными начальными состояниями.
3️⃣Чистота кода: init делает код более читаемым и понятным, так как инициализация объектов происходит в одном месте.
Рассмотрим более сложный пример:
class Car:
def __init__(self, brand, model, year):
self.brand = brand
self.model = model
self.year = year
def display_info(self):
print(f"{self.brand} {self.model}, {self.year}")
# Создание экземпляров класса Car
car1 = Car("Toyota", "Corolla", 2020)
car2 = Car("Honda", "Civic", 2019)
car1.display_info() # Выведет: Toyota Corolla, 2020
car2.display_info() # Выведет: Honda Civic, 2019
В этом примере метод init задает марку, модель и год выпуска автомобиля. Метод display_info выводит информацию об автомобиле.
Метод init используется для инициализации новых объектов класса. Он позволяет задавать начальные значения атрибутов, делая объекты готовыми к использованию сразу после их создания.
👉 Можно посмотреть Примеры как отвечают люди на этот вопрос, или перейти К списку 1096 вопроса на Python разработчика. Ставь 👍 если нравится контент
🔐 База собесов | 🔐 База тестовыхwith), он должен реализовать методы __enter__ иак реализо Эти методы управляют инициализацией и завершением контекста, соответственно.
Рассмотрим пример класса, который открывает и закрывает файл:
class FileManager:
def __init__(self, filename, mode):
self.filename = filename
self.mode = mode
self.file = None
def __enter__(self):
self.file = open(self.filename, self.mode)
return self.file
def __exit__(self, exc_type, exc_value, traceback):
if self.file:
self.file.close()
# Использование класса FileManager в конструкции with
with FileManager('example.txt', 'w') as file:
file.write('Hello, world!')
# После выхода из блока with файл будет закрыт автоматически
Объяснение
1️⃣Конструкторelf.file.cl
✅Принимает имя файла и режим его открытия.
✅Инициализирует атрибут file значением None.
2️⃣Метод enter:
✅Открывает файл и сохраняет его объект в атрибут file.
✅Возвращает объект файла, чтобы он мог быть использован в блоке with.
3️⃣Метод exit:
✅Закрывает файл, если он был успешно открыт.
✅Принимает три аргумента (exc_type, exc_value, traceback), которые используются для обработки исключений. Если в блоке with возникло исключение, эти аргументы содержат информацию о нем.
Обработка исключений
Метод exit может обрабатывать исключения, возникшие в блоке with. Если метод возвращает True, исключение подавляется и не передается дальше. Если метод возвращает False (или ничего не возвращает), исключение передается дальше.
Пример с обработкой исключений
class FileManager:
def __init__(self, filename, mode):
self.filename = filename
self.mode = mode
self.file = None
def __enter__(self):
self.file = open(self.filename, self.mode)
return self.file
def __exit__(self, exc_type, exc_value, traceback):
if self.file:
self.file.close()
if exc_type is not None:
print(f"An exception occurred: {exc_value}")
return True # Подавляет исключение
# Использование класса FileManager с исключением
try:
with FileManager('example.txt', 'w') as file:
file.write('Hello, world!')
raise ValueError("An intentional error")
except ValueError:
print("ValueError caught")
# После выхода из блока with файл будет закрыт автоматически
Объяснение:
✅Если в блоке with возникает исключение, метод exit обрабатывает его, выводит сообщение и возвращает True, что подавляет исключение и не передает его дальше.
✅Блок try позволяет убедиться, что исключение обработано правильно.
Чтобы класс мог работать в менеджере контекста (в конструкции with), необходимо реализовать методыает True, чиак реализо Методализовать кинициализирует ресурс и возвращает его, чтобы он мог быть использован в блоке with. Методероятностьосвобождает ресурс и может обрабатывать исключения, возникающие в блоке with.
👉 Можно посмотреть Примеры как отвечают люди на этот вопрос, или перейти К списку 1096 вопроса на Python разработчика. Ставь 👍 если нравится контент
🔐 База собесов | 🔐 База тестовых__iter__() должен возвращать сам итератор (обычно это сам объект), а метод __next__() должен возвращать следующий элемент последовательности или выбрасывать исключение StopIteration, когда элементы заканчиваются.
Вот пример класса, который реализует протокол итератора:
class MyRange:
def __init__(self, start, end):
self.start = start
self.end = end
self.current = start
def __iter__(self):
return self
def __next__(self):
if self.current < self.end:
current = self.current
self.current += 1
return current
else:
raise StopIteration
# Использование класса MyRange
my_range = MyRange(1, 5)
for number in my_range:
print(number) # Выведет: 1 2 3 4
Объяснение
1️⃣Конструктор __init__:
✅Инициализирует начальное значение (start), конечное значение (end) и текущее значение (current), которое будет изменяться при итерации.
2️⃣Метод iter:
✅Возвращает сам итератор, то есть self.
3️⃣Метод next:
✅Проверяет, достигло ли текущее значение (self.current) конечного значения (self.end).
✅Если текущее значение меньше конечного, метод увеличивает текущее значение на 1 и возвращает предыдущее текущее значение.
✅Если текущее значение больше или равно конечному, выбрасывается исключение StopIteration.
Можно также создать более сложный итератор, например, для перебора элементов списка.
class MyListIterator:
def init(self, my_list):
self.my_list = my_list
self.index = 0
def iter(self):
return self
def next():
if self.index < len(self.my_list):
result = self.my_list[self.index]
self.index += 1
return result
else:
raise StopIteration
# Использование класса MyListIterator
my_list = [10, 20, 30, 40]
my_iterator = MyListIterator(my_list)
for item in my_iterator:
print(item) # Выведет: 10 20 30 40
Обработка итераций с вложенными циклами
Иногда может потребоваться использовать итератор в контексте вложенных циклов или других структур. В этом случае итератор должен поддерживать повторное использование.
class ResettableRange:
def __init__(self, start, end):
self.start = start
self.end = end
self.current = start
def __iter__(self):
self.current = self.start # Сброс текущего значения при начале новой итерации
return self
def __next__(self):
if self.current < self.end:
current = self.current
self.current += 1
return current
else:
raise StopIteration
# Использование класса ResettableRange
resettable_range = ResettableRange(1, 5)
# Первый цикл
for number in resettable_range:
print(number) # Выведет: 1 2 3 4
# Второй цикл
for number in resettable_range:
print(number) # Снова выведет: 1 2 3 4
Чтобы создать класс, поддерживающий протокол итератора, нужно реализовать методы iter() и next(). Метод iter() возвращает сам итератор, а метод next() возвращает следующий элемент или выбрасывает StopIteration, когда элементы заканчиваются.
👉 Можно посмотреть Примеры как отвечают люди на этот вопрос, или перейти К списку 1096 вопроса на Python разработчика. Ставь 👍 если нравится контент
🔐 База собесов | 🔐 База тестовых__next__(), который возвращает следующий элемент коллекции или вызывает исключение StopIteration, если элементы коллекции закончились.
Рассмотрим простой пример с использованием списка:
# Создание списка
my_list = [1, 2, 3, 4, 5]
# Создание итератора из списка
my_iterator = iter(my_list)
# Перебор элементов с помощью итератора
print(next(my_iterator)) # Выведет: 1
print(next(my_iterator)) # Выведет: 2
print(next(my_iterator)) # Выведет: 3
print(next(my_iterator)) # Выведет: 4
print(next(my_iterator)) # Выведет: 5
# Следующий вызов next() вызовет исключение StopIteration
# print(next(my_iterator)) # StopIteration
Итераторы можно создавать из различных коллекций, таких как строки, кортежи, множества и словари.
Примеры:
С строкой
my_string = "hello"
my_iterator = iter(my_string)
print(next(my_iterator)) # Выведет: h
print(next(my_iterator)) # Выведет: e
print(next(my_iterator)) # Выведет: l
print(next(my_iterator)) # Выведет: l
print(next(my_iterator)) # Выведет: o
С кортежем
my_tuple = (10, 20, 30)
my_iterator = iter(my_tuple)
print(next(my_iterator)) # Выведет: 10
print(next(my_iterator)) # Выведет: 20
print(next(my_iterator)) # Выведет: 30
С множеством
my_set = {1, 2, 3}
my_iterator = iter(my_set)
print(next(my_iterator)) # Выведет один из элементов множества (порядок не гарантирован)
print(next(my_iterator)) # Выведет другой элемент множества
print(next(my_iterator)) # Выведет оставшийся элемент множества
Со словарём
my_dict = {'a': 1, 'b': 2, 'c': 3}
my_iterator = iter(my_dict)
print(next(my_iterator)) # Выведет: a
print(next(my_iterator)) # Выведет: b
print(next(my_iterator)) # Выведет: c
Создание пользовательского итератора
Вы также можете создать собственный итератор, определив методы __iter__() и __next__() в своем классе.
Пример пользовательского итератора
class MyIterator:
def __init__(self, start, end):
self.current = start
self.end = end
def __iter__(self):
return self
def __next__(self):
if self.current < self.end:
self.current += 1
return self.current - 1
else:
raise StopIteration
# Использование пользовательского итератора
my_iter = MyIterator(1, 5)
for num in my_iter:
print(num) # Выведет: 1 2 3 4
Для создания итератора из коллекции используйте функцию iter(). Итераторы позволяют перебирать элементы коллекции один за другим с помощью метода next(). Вы также можете создать собственный итератор, реализовав методы __iter__() и __next__() в своем классе.
👉 Можно посмотреть Примеры как отвечают люди на этот вопрос, или перейти К списку 1096 вопроса на Python разработчика. Ставь 👍 если нравится контент
🔐 База собесов | 🔐 База тестовыхclass Animal:
def make_sound(self):
pass
class Dog(Animal):
def make_sound(self):
return "Bark"
class Cat(Animal):
def make_sound(self):
return "Meow"
def make_animal_sound(animal):
print(animal.make_sound())
# Использование полиморфизма подтипов
dog = Dog()
cat = Cat()
make_animal_sound(dog) # Выведет: Bark
make_animal_sound(cat) # Выведет: Meow
Полиморфизм перегрузки (параметрический полиморфизм)
Нет явной поддержки перегрузки функций и методов, как в некоторых других языках программирования. Однако, параметрический полиморфизм можно достичь через использование аргументов с значениями по умолчанию, переменным количеством аргументов, а также с помощью таких структур данных, как списки и словари.
Пример
def add(a, b):
return a + b
print(add(1, 2)) # Выведет: 3 (работает с числами)
print(add("Hello, ", "World!")) # Выведет: Hello, World! (работает со строками)
В этом примере функция add работает с разными типами данных благодаря динамической типизации в Python.
Полиморфизм утиной типизации (по интерфейсу)
Основывается на принципе "Если это выглядит как утка, плавает как утка и крякает как утка, то это, вероятно, утка". Это означает, что не важно, к какому классу принадлежит объект, главное, чтобы он имел нужные методы или атрибуты.
Пример
class Duck:
def quack(self):
return "Quack"
class Person:
def quack(self):
return "I can imitate a duck"
def make_it_quack(duck_like):
print(duck_like.quack())
duck = Duck()
person = Person()
make_it_quack(duck) # Выведет: Quack
make_it_quack(person) # Выведет: I can imitate a duck
Полиморфизм функций высшего порядка
Можно также применять полиморфизм с функциями высшего порядка — функциями, которые принимают другие функции в качестве аргументов или возвращают функции в качестве результата.
Пример
def apply_function(func, value):
return func(value)
def square(x):
return x * x
def double(x):
return x * 2
print(apply_function(square, 4)) # Выведет: 16
print(apply_function(double, 4)) # Выведет: 8
1️⃣Полиморфизм подтипов: Использование объектов подклассов через базовый класс.
2️⃣Полиморфизм перегрузки: Функции и методы могут работать с разными типами данных, хотя явной перегрузки в Python нет.
3️⃣Полиморфизм утиной типизации: Объекты используются на основе наличия необходимых методов или атрибутов, независимо от их класса.
4️⃣Функции высшего порядка: Функции, принимающие или возвращающие другие функции, могут работать с разными типами функций.
👉 Можно посмотреть Примеры как отвечают люди на этот вопрос, или перейти К списку 1096 вопроса на Python разработчика. Ставь 👍 если нравится контент
🔐 База собесов | 🔐 База тестовыхabc (Abstract Base Classes).
Пример:
from abc import ABC, abstractmethod
class Animal(ABC):
@abstractmethod
def make_sound(self):
pass
class Dog(Animal):
def make_sound(self):
return "Bark"
class Cat(Animal):
def make_sound(self):
return "Meow"
# Создание экземпляров конкретных классов
dog = Dog()
cat = Cat()
print(dog.make_sound()) # Выведет: Bark
print(cat.make_sound()) # Выведет: Meow
# Попытка создания экземпляра абстрактного класса приведет к ошибке
# animal = Animal() # TypeError: Can't instantiate abstract class Animal with abstract methods make_sound
Основные компоненты
1️⃣Абстрактный класс (Animal): Определяет общие методы, которые должны быть реализованы в подклассах.
2️⃣Абстрактный метод (make_sound): Объявляется в абстрактном классе и должен быть реализован в любом конкретном подклассе.
3️⃣Конкретные классы (Dog и Cat): Реализуют абстрактный метод, предоставляя конкретную реализацию.
Преимущества
1️⃣Упрощение разработки: Позволяет сосредоточиться на высокоуровневом дизайне, не отвлекаясь на детали реализации.
2️⃣Повышение гибкости: Изменения в реализации могут быть сделаны без изменения интерфейсов, что облегчает модификацию и расширение кода.
3️⃣Улучшение читаемости: Абстрактные классы и методы делают код более понятным и структурированным, четко показывая, какие методы должны быть реализованы в подклассах.
Абстракция в ООП позволяет скрывать сложные детали реализации, предоставляя простой интерфейс для взаимодействия с объектами. Она упрощает разработку, улучшает читаемость кода и повышает его гибкость. Можно реализовать с помощью абстрактных классов и методов, используя модуль abc.
👉 Можно посмотреть Примеры как отвечают люди на этот вопрос, или перейти К списку 1096 вопроса на Python разработчика. Ставь 👍 если нравится контент
🔐 База собесов | 🔐 База тестовыхstr() и при вызове print().
✅Предназначение: Для более дружественного и читаемого представления объекта.
Метод repr
✅Цель: Должен возвращать строку, которая официально представляет объект и, по возможности, позволяет воссоздать объект, если передать эту строку в eval().
✅Использование: Метод repr используется функцией repr() и вызывается интерактивной оболочкой Python для отображения объектов.
✅Предназначение: Для более точного и детализированного представления объекта, предназначенного для разработчиков.
Пример
class MyClass:
def __init__(self, value):
self.value = value
def __str__(self):
return f"MyClass with value {self.value}"
def __repr__(self):
return f"MyClass({self.value})"
obj = MyClass(10)
# Использование_(self):
print(str(obj)) # Выведет: MyClass with value 10
print(obj) # Выведет: MyClass with value 10 (так как print вызывает str)
# Использование repr
print(repr(obj)) # Выведет: MyClass(10)
Основные различия
1️⃣Контекст использования:
✅__str__ предназначен для удобного представления объекта пользователю.
✅__repr__ предназначен для официального представления объекта, полезного для отладки и разработки.
2️⃣Вызываемые функции:
✅str() и print() используют str.
✅repr() и интерактивная оболочка Python используют repr.
3️⃣Содержимое строки:
✅__str__ возвращает удобочитаемую строку.
✅__repr__ возвращает строку, которая может включать больше технической информации и может использоваться для воссоздания объекта.
Пример с реализацией обоих методов
class Point:
def __init__(self, x, y):
self.x = x
self.y = y
def __str__(self):
return f"Point({self.x}, {self.y})"
def __repr__(self):
return f"Point({self.x}, {self.y})"
p = Point(1, 2)
# Использование str
print(str(p)) # Выведет: Point(1, 2)
print(p) # Выведет: Point(1, 2)
# Использование repr
print(repr(p)) # Выведет: Point(1, 2)
Дополнительный пример с различием междуstr__ и _и repr
class ComplexNumber:
def __init__(self, real, imag):
self.real = real
self.imag = imag
def __str__(self):
return f"{self.real} + {self.imag}i"
def __repr__(self):
return f"ComplexNumber({self.real}, {self.imag})"
c = ComplexNumber(3, 4)
# Использование str
print(str(c)) # Выведет: 3 + 4i
print(c) # Выведет: 3 + 4i
# Использование_ и repr иprint(repr(c)) # Выведет: ComplexNumber(3, 4)
Метод str возвращает понятное для пользователя строковое представление объекта, используемое функцией str() и print(). Метод repr возвращает официальное строковое представление объекта, используемое функцией repr() и интерактивной оболочкой, и часто предназначен для отладки.
👉 Можно посмотреть Примеры как отвечают люди на этот вопрос, или перейти К списку 1096 вопроса на Python разработчика. Ставь 👍 если нравится контент
🔐 База собесов | 🔐 База тестовыхclass A:
def __init__(self):
print("Constructor of A")
class B(A):
def __init__(self):
print("Constructor of B")
super().__init__()
# Создание экземпляра класса B
b = B()
Порядок вызова
1️⃣Когда создается объект класса B, сначала вызывается его конструктор __init__.
2️⃣Внутри конструктора B вызов super().__init__() вызывает конструктор базового класса A.
Вывод программы будет:
Constructor of B Constructor of AЭто означает, что сначала вызывается конструктор
B, а затем конструктор A.
Метод разрешения порядка (MRO, Method Resolution Order)
Определяет порядок, в котором классы будут обрабатываться при наследовании. В Python этот порядок можно получить с помощью атрибута mro или функции mro().
Пример:
print(B.__mro__)
Вывод будет:
(<class '__main__.B'>, <class '__main__.A'>, <class 'object'>)Это означает, что порядок разрешения методов для класса
B следующий:
1️⃣B
2️⃣A
3️⃣object
При множественном наследовании MRO становится еще важнее. Рассмотрим пример:
class A:
def __init__(self):
print("Constructor of A")
class B(A):
def __init__(self):
print("Constructor of B")
super().__init__()
class C(A):
def __init__(self):
print("Constructor of C")
super().__init__()
class D(B, C):
def __init__(self):
print("Constructor of D")
super().__init__()
# Создание экземпляра класса D
d = D()
Порядок вызова
Когда создается объект класса D, вызовы конструкторов происходят в соответствии с MRO для D.
Получение:
print(D.__mro__)
Вывод будет:
(<class '__main__.D'>, <class '__main__.B'>, <class '__main__.C'>, <class '__main__.A'>, <class 'object'>)Вывод программы будет:
Constructor of D Constructor of B Constructor of C Constructor of AЭто означает, что порядок вызова конструкторов следующий: 1️⃣
D
2️⃣B
3️⃣C
4️⃣A
При создании объекта класса сначала вызывается конструктор самого класса, затем конструкторы его базовых классов в порядке, определенном MRO. В случае множественного наследования порядок вызова конструкторов определяется методом разрешения порядка (MRO).
👉 Можно посмотреть Примеры как отвечают люди на этот вопрос, или перейти К списку 1096 вопроса на Python разработчика. Ставь 👍 если нравится контент
🔐 База собесов | 🔐 База тестовыхclass MyClass:
class_attr = 42 # Атрибут класса
def __init__(self, value):
self.instance_attr = value # Атрибут экземпляра
def instance_method(self):
return f"Instance attribute: {self.instance_attr}"
@classmethod
def class_method(cls):
return f"Class attribute: {cls.class_attr}"
# Доступ к атрибуту класса через класс
print(MyClass.class_attr) # Выведет: 42
# Создание экземпляра класса
obj1 = MyClass(10)
obj2 = MyClass(20)
# Доступ к атрибуту класса через экземпляры
print(obj1.class_attr) # Выведет: 42
print(obj2.class_attr) # Выведет: 42
# Изменение атрибута класса
MyClass.class_attr = 100
print(obj1.class_attr) # Выведет: 100
print(obj2.class_attr) # Выведет: 100
Атрибуты экземпляра (instance attributes)
Принадлежат конкретному объекту (экземпляру) класса. Они обычно инициализируются в методе __init__ и могут иметь разные значения для разных экземпляров.
Пример:
class MyClass:
def __init__(self, value):
self.instance_attr = value # Атрибут экземпляра
def instance_method(self):
return f"Instance attribute: {self.instance_attr}"
# Создание экземпляров класса
obj1 = MyClass(10)
obj2 = MyClass(20)
# Доступ к атрибутам экземпляров
print(obj1.instance_attr) # Выведет: 10
print(obj2.instance_attr) # Выведет: 20
# Изменение атрибутов экземпляров
obj1.instance_attr = 15
print(obj1.instance_attr) # Выведет: 15
print(obj2.instance_attr) # Выведет: 20
Основные различия
1️⃣Принадлежность:
✅Атрибуты класса принадлежат самому классу и одинаковы для всех его экземпляров.
✅Атрибуты экземпляра принадлежат конкретному объекту и могут различаться между экземплярами.
2️⃣Инициализация:
✅Атрибуты класса определяются в теле класса вне методов.
✅Атрибуты экземпляра обычно инициализируются в методеass(10)
obили других методах экземпляра.
3️⃣Доступ:
✅Атрибуты класса могут быть доступны как через класс, так и через его экземпляры.
✅Атрибуты экземпляра доступны только через экземпляры.
4️⃣Обновление:
✅Изменение атрибута класса через класс влияет на все экземпляры, но изменение атрибута экземпляра затрагивает только конкретный экземпляр.
Пример совмещения атрибутов класса и экземпляра
class MyClass:
class_attr = "Class attribute"
def __init__(self, instance_value):
self.instance_attr = instance_value
def show_attrs(self):
return f"{self.instance_attr} | {MyClass.class_attr}"
# Создание экземпляров класса
obj1 = MyClass("Instance 1")
obj2 = MyClass("Instance 2")
# Доступ к атрибутам через экземпляры
print(obj1.show_attrs()) # Выведет: Instance 1 | Class attribute
print(obj2.show_attrs()) # Выведет: Instance 2 | Class attribute
# Изменение атрибута класса
MyClass.class_attr = "New Class attribute"
print(obj1.show_attrs()) # Выведет: Instance 1 | New Class attribute
print(obj2.show_attrs()) # Выведет: Instance 2 | New Class attribute
# Изменение атрибута экземпляра
obj1.instance_attr = "Updated Instance 1"
print(obj1.show_attrs()) # Выведет: Updated Instance 1 | New Class attribute
Атрибуты класса принадлежат классу и одинаковы для всех его экземпляров. Атрибуты экземпляра принадлежат конкретным объектам и могут отличаться между экземплярами. Объявляются в теле класса, тогда как атрибуты экземпляра обычно инициализируются в методеalue # Ат
👉 Можно посмотреть Примеры как отвечают люди на этот вопрос, или перейти К списку 1096 вопроса на Python разработчика. Ставь 👍 если нравится контент
🔐 База собесов | 🔐 База тестовых
اکنون در دسترس! پژوهش تلگرام ۲۰۲۵ — مهمترین بینشهای سال 
