Python | Вопросы собесов
Cайт: easyoffer.ru Реклама: @easyoffer_adv ВП: @easyoffer_vp Тесты t.me/+20tRfhrwPpM4NDQy Задачи t.me/+nsl4meWmhfQwNDVi Вакансии t.me/+cXGKkrOY2-w3ZTky
Show more📈 Analytical overview of Telegram channel Python | Вопросы собесов
Channel Python | Вопросы собесов (@python_easy_ru) in the Russian language segment is an active participant. Currently, the community unites 13 104 subscribers, ranking 9 734 in the Technologies & Applications category and 50 704 in the Russia region.
📊 Audience metrics and dynamics
Since its creation on невідомо, the project has demonstrated rapid growth, gathering an audience of 13 104 subscribers.
According to the latest data from 10 June, 2026, the channel demonstrates stable activity. Although there has been a change in the number of participants by -55 over the last 30 days and by 1 over the last 24 hours, overall reach remains high.
- Verification status: Not verified
- Engagement rate (ER): The average audience engagement rate is 8.86%. Within the first 24 hours after publication, content typically collects 5.51% reactions from the total number of subscribers.
- Post reach: On average, each post receives 1 161 views. Within the first day, a publication typically gains 722 views.
- Reactions and interaction: The audience actively supports content: the average number of reactions per post is 3.
- Thematic interests: Content is focused on key topics such as ставь, модуль, строка, docker, alice.
📝 Description and content policy
The author describes the resource as a platform for expressing subjective opinions:
“Cайт: easyoffer.ru
Реклама: @easyoffer_adv
ВП: @easyoffer_vp
Тесты t.me/+20tRfhrwPpM4NDQy
Задачи t.me/+nsl4meWmhfQwNDVi
Вакансии t.me/+cXGKkrOY2-w3ZTky”
Thanks to the high frequency of updates (latest data received on 11 June, 2026), the channel maintains relevance and a high level of publication reach. Analytics show that the audience actively interacts with content, making it an important point of influence in the Technologies & Applications category.
class FileHandler:
def read_file(self, filename):
with open(filename, 'r') as file:
return file.read()
def write_file(self, filename, data):
with open(filename, 'w') as file:
file.write(data)
Функция, выполняющая одну конкретную задачу:
def calculate_sum(numbers):
return sum(numbers)
Преимущества высокой когезии:
🟠Улучшенная читабельность и понятность кода.
🟠Легкость сопровождения и изменения.
🟠Повышенная вероятность повторного использования модулей.
🚩Связность (Coupling)
Связность относится к степени зависимости одного модуля от другого. Высокая связность означает, что модули сильно зависят друг от друга, что делает систему более жесткой и сложной для сопровождения. Низкая связность, напротив, означает, что модули имеют минимальные зависимости друг от друга, что делает систему более гибкой и легко модифицируемой.
Использование интерфейсов или абстракций:
class Database:
def connect(self):
pass
class MySQLDatabase(Database):
def connect(self):
print("Connecting to MySQL database")
class PostgreSQLDatabase(Database):
def connect(self):
print("Connecting to PostgreSQL database")
def initialize_db(db: Database):
db.connect()
db = MySQLDatabase()
initialize_db(db)
Внедрение зависимостей:
class Service:
def __init__(self, repository):
self.repository = repository
def perform_action(self):
self.repository.save("Some data")
class Repository:
def save(self, data):
print(f"Saving {data}")
repository = Repository()
service = Service(repository)
service.perform_action()
Преимущества низкой связности:
🟠 Легкость сопровождения и тестирования.
🟠 Улучшенная гибкость и расширяемость системы.
🟠 Возможность повторного использования модулей в разных контекстах.
Ставь 👍 и забирай 📚 Базу знанийclass A:
def say_hello(self):
print("Hello from A")
class B:
def say_hello(self):
print("Hello from B")
class C(A, B):
pass
c = C()
c.say_hello()
🚩Порядок разрешения методов (MRO)
В примере выше класс C наследует от классов A и B. Метод say_hello есть в обоих родительских классах. Порядок разрешения методов в классе C будет таким: C -> A -> B. Чтобы увидеть MRO, можно использовать метод __mro__ или функцию mro():
print(C.__mro__)
# (<class '__main__.C'>, <class '__main__.A'>, <class '__main__.B'>, <class 'object'>)
print(C.mro())
# [<class '__main__.C'>, <class '__main__.A'>, <class '__main__.B'>, <class 'object'>]
Таким образом, при вызове c.say_hello() будет вызван метод say_hello класса A, так как он идет первым в MRO.
🚩Пример с переопределением метода в дочернем классе
Если вы переопределите метод в дочернем классе, то будет вызван метод, определенный в самом дочернем классе:
class A:
def say_hello(self):
print("Hello from A")
class B:
def say_hello(self):
print("Hello from B")
class C(A, B):
def say_hello(self):
print("Hello from C")
c = C()
c.say_hello()
# Вывод: Hello from C
🚩Вызов методов родительских классов с использованием super()
Иногда необходимо явно вызвать метод одного из родительских классов. Для этого используется функция super(), которая возвращает объект, через который можно вызывать методы родительского класса.
class A:
def say_hello(self):
print("Hello from A")
class B:
def say_hello(self):
print("Hello from B")
class C(A, B):
def say_hello(self):
super().say_hello()
print("Hello from C")
c = C()
c.say_hello()
# Вывод:
# Hello from A
# Hello from C
🚩Вызов методов конкретных родительских классов
Можно вызвать его напрямую через имя класса:
class A:
def say_hello(self):
print("Hello from A")
class B:
def say_hello(self):
print("Hello from B")
class C(A, B):
def say_hello(self):
A.say_hello(self)
B.say_hello(self)
print("Hello from C")
c = C()
c.say_hello()
# Вывод:
# Hello from A
# Hello from B
# Hello from C
Ставь 👍 и забирай 📚 Базу знанийCar использует объект Engine, то Engine является зависимостью для Car.
2️⃣Внедрение: Процесс передачи зависимостей классу. Вместо того чтобы создавать зависимости внутри класса, они передаются извне.
🤔 Преимущества внедрения зависимостей
1️⃣Снижение связности: Классы меньше зависят друг от друга, что упрощает их замену или модификацию.
2️⃣ Упрощение тестирования: Легче подменять реальные зависимости на моки или стабы для написания тестов.
3️⃣ Улучшение читаемости и поддержки кода: Код становится более модульным и легче поддерживается.
🤔 Типы внедрения зависимостей
1️⃣ Внедрение через конструктор: Зависимости передаются через параметры конструктора.
2️⃣ Внедрение через методы (или сеттеры): Зависимости передаются через специальные методы.
3️⃣ Внедрение через свойства: Зависимости назначаются через свойства объекта.
🤔 Пример внедрения через конструктор
Рассмотрим пример, где класс Car зависит от класса Engine.
class Engine:
def start(self):
print("Engine started")
class Car:
def __init__(self, engine):
self.engine = engine
def start(self):
self.engine.start()
print("Car started")
# Создание объекта Engine
engine = Engine()
# Внедрение зависимости Engine в объект Car через конструктор
car = Car(engine)
car.start()
🤔 Пример внедрения через методы (сеттеры)
class Engine:
def start(self):
print("Engine started")
class Car:
def __init__(self):
self.engine = None
def set_engine(self, engine):
self.engine = engine
def start(self):
if self.engine is not None:
self.engine.start()
print("Car started")
else:
print("No engine to start")
# Создание объекта Engine
engine = Engine()
# Создание объекта Car
car = Car()
# Внедрение зависимости Engine в объект Car через метод
car.set_engine(engine)
car.start()
🤔 Пример внедрения через свойства
class Engine:
def start(self):
print("Engine started")
class Car:
def __init__(self):
self._engine = None
@property
def engine(self):
return self._engine
@engine.setter
def engine(self, engine):
self._engine = engine
def start(self):
if self._engine is not None:
self._engine.start()
print("Car started")
else:
print("No engine to start")
# Создание объекта Engine
engine = Engine()
# Создание объекта Car
car = Car()
# Внедрение зависимости Engine в объект Car через свойство
car.engine = engine
car.start()
🤔 Краткий итог:
1️⃣Внедрение зависимостей (DI) позволяет передавать зависимости извне, а не создавать их внутри класса.
2️⃣Это снижает связанность, улучшает тестируемость и упрощает поддержку кода.
3️⃣ Существует несколько способов внедрения зависимостей: через конструктор, методы и свойства.
🔥 ТОП ВОПРОСОВ С СОБЕСОВ
🔒 База собесов | 🔒 База тестовыхself, который указывает на текущий экземпляр класса.
2️⃣ Использование атрибутов:
➕ Могут изменять состояние экземпляра, то есть работать с его атрибутами.
3️⃣ Определение:
class MyClass:
def instance_method(self, value):
self.value = value
4️⃣ Вызов:
➕ Вызываются через экземпляр класса.
instance = MyClass()
instance.instance_method(10)
Пример:
class Dog:
def __init__(self, name):
self.name = name
def bark(self):
print(f"{self.name} говорит: Гав-гав!")
dog = Dog("Бобик")
dog.bark() # Вывод: Бобик говорит: Гав-гав!
🤔 Методы класса (Class Methods)
1️⃣ Привязка к классу:
➕ Методы класса работают с самим классом и его атрибутами.
➕ Они принимают первым аргументом cls, который указывает на сам класс.
2️⃣ Использование атрибутов:
➕ Могут изменять состояние класса, то есть работать с атрибутами класса.
3️⃣ Определение:
class MyClass:
class_variable = 0
@classmethod
def class_method(cls, value):
cls.class_variable = value
4️⃣ Вызов:
➕ Могут вызываться как через сам класс, так и через его экземпляры.
MyClass.class_method(10)
instance = MyClass()
instance.class_method(20)
Пример:
class Dog:
total_dogs = 0
def __init__(self, name):
self.name = name
Dog.total_dogs += 1
@classmethod
def get_total_dogs(cls):
return cls.total_dogs
dog1 = Dog("Бобик")
dog2 = Dog("Шарик")
print(Dog.get_total_dogs()) # Вывод: 2
🤔 Краткий итог:
1️⃣ Обычные методы:
➕ Работают с конкретными экземплярами класса.
➕ Принимают self как первый аргумент.
➕ Могут изменять состояние экземпляра.
➕ Вызываются через экземпляр класса.
2️⃣ Методы класса:
➕ Работают с самим классом.
➕ Принимают cls как первый аргумент.
➕ Могут изменять состояние класса.
➕ Могут вызываться как через класс, так и через экземпляры.
🔥 ТОП ВОПРОСОВ С СОБЕСОВ
🔒 База собесов | 🔒 База тестовых@classmethod. Такие методы принимают первым аргументом не self (как в методах экземпляра), а cls, что указывает на сам класс.
Пример:
class MyClass:
class_variable = 0
@classmethod
def class_method(cls, value):
cls.class_variable = value
🤔 Пример использования метода класса
Метод класса можно вызывать как на уровне класса, так и через экземпляры класса:
# Вызов метода класса через сам класс
MyClass.class_method(10)
print(MyClass.class_variable) # Вывод: 10
# Вызов метода класса через экземпляр класса
instance = MyClass()
instance.class_method(20)
print(MyClass.class_variable) # Вывод: 20
🤔 Зачем нужны методы класса
1️⃣ Работа с атрибутами класса: Методы класса позволяют изменять атрибуты класса, а не отдельного экземпляра. Это полезно, когда нужно поддерживать общее состояние для всех экземпляров класса.
2️⃣ Фабричные методы: Методы класса часто используются для создания экземпляров класса с определенными параметрами или для реализации альтернативных конструкторов.
3️⃣ Логическая группировка: Они позволяют логически группировать функции, связанные с классом, делая код более организованным и понятным.
🤔 Пример фабричного метода
Фабричный метод — это метод класса, который возвращает новый экземпляр класса. Рассмотрим пример, где метод класса используется для создания объекта с предустановленными значениями.
class Person:
def __init__(self, name, age):
self.name = name
self.age = age
@classmethod
def from_birth_year(cls, name, birth_year):
age = 2024 - birth_year
return cls(name, age)
# Создание экземпляра через основной конструктор
person1 = Person("Alice", 30)
print(person1.name, person1.age) # Вывод: Alice 30
# Создание экземпляра через фабричный метод
person2 = Person.from_birth_year("Bob", 1990)
print(person2.name, person2.age) # Вывод: Bob 34
🤔 Сравнение с методами экземпляра и статическими методами
➕ Методы экземпляра: Методы, которые работают с конкретным экземпляром класса и могут изменять его состояние (принимают self).
class MyClass:
def instance_method(self, value):
self.value = value
➕ Статические методы: Методы, которые не зависят от состояния экземпляра или класса и не могут его изменять (используют декоратор @staticmethod).
class MyClass:
@staticmethod
def static_method(arg1, arg2):
return arg1 + arg2
➕ Методы класса: Методы, которые работают с самим классом и могут изменять его состояние (используют декоратор @classmethod).
class MyClass:
class_variable = 0
@classmethod
def class_method(cls, value):
cls.class_variable = value
🤔 Краткий итог:
1️⃣ Методы класса используются для работы с атрибутами и состоянием самого класса.
2️⃣ Они создаются с помощью декоратора @classmethod и принимают cls в качестве первого аргумента.
3️⃣ Часто применяются для реализации фабричных методов и логической группировки функций, связанных с классом.
🔥 ТОП ВОПРОСОВ С СОБЕСОВ
🔒 База собесов | 🔒 База тестовых@staticmethod. Давайте рассмотрим пример:
class MyClass:
@staticmethod
def static_method(arg1, arg2):
return arg1 + arg2
🤔 Пример использования статического метода
Вы можете вызывать статический метод как через сам класс, так и через его экземпляр:
result = MyClass.static_method(5, 10)
print(result) # Вывод: 15
my_instance = MyClass()
result = my_instance.static_method(3, 7)
print(result) # Вывод: 10
🤔 Зачем нужны статические методы
1️⃣ Логическая группировка: Статические методы позволяют логически группировать функции, которые связаны с классом, но не зависят от состояния конкретного экземпляра. Это помогает организовать код и делает его более читабельным.
2️⃣ Удобство вызова: Иногда полезно вызывать метод, не создавая экземпляр класса. Например, если метод выполняет какую-то утилитарную функцию или обрабатывает данные, не связанные с объектом.
3️⃣ Избежание изменений состояния: Поскольку статические методы не могут изменять состояние экземпляра или класса, их использование может способствовать созданию безопасного и предсказуемого кода.
🤔 Сравнение с методами класса и экземпляра
➕ Методы экземпляра: Методы экземпляра (instance methods) принимают первым аргументом self, что позволяет им изменять состояние конкретного экземпляра класса.
class MyClass:
def instance_method(self, value):
self.value = value
➕ Методы класса: Методы класса (class methods) принимают первым аргументом cls, что позволяет им изменять состояние самого класса.
class MyClass:
class_variable = 0
@classmethod
def class_method(cls, value):
cls.class_variable = value
➕ Статические методы: Статические методы не принимают self или cls в качестве первого аргумента и не могут изменять состояние экземпляра или класса.
class MyClass:
@staticmethod
def static_method(arg1, arg2):
return arg1 + arg2
🤔 Краткий итог:
1️⃣Статические методы используются для функций, которые не зависят от состояния экземпляра или класса.
2️⃣ Они создаются с помощью декоратора @staticmethod.
3️⃣ Такие методы удобны для логической группировки и вызова функций без создания экземпляра класса.
🔥 ТОП ВОПРОСОВ С СОБЕСОВ
🔒 База собесов | 🔒 База тестовых__iter__() и __next__(). Давайте рассмотрим пошагово, как это сделать.
1️⃣ Определение класса
Начнем с создания класса, который будет содержать коллекцию данных. В данном примере это будет список.
class MyIterable:
def __init__(self, data):
self.data = data
self.index = 0
2️⃣: Метод `__iter__()`
Метод __iter__() должен возвращать сам итератор. В данном случае наш класс сам будет являться итератором, поэтому метод __iter__() будет возвращать self.
class MyIterable:
def __init__(self, data):
self.data = data
self.index = 0
def __iter__(self):
return self
3️⃣ Метод `__next__()`
Метод __next__() должен возвращать следующий элемент последовательности. Если элементы закончились, метод должен вызывать исключение StopIteration.
class MyIterable:
def __init__(self, data):
self.data = data
self.index = 0
def __iter__(self):
return self
def __next__(self):
if self.index < len(self.data):
result = self.data[self.index]
self.index += 1
return result
else:
raise StopIteration
🤔 Полный пример
class MyIterable:
def __init__(self, data):
self.data = data
self.index = 0
def __iter__(self):
return self
def __next__(self):
if self.index < len(self.data):
result = self.data[self.index]
self.index += 1
return result
else:
raise StopIteration
# Создаем объект нашего класса
my_iterable = MyIterable([10, 20, 30, 40, 50])
# Используем его в цикле for
for item in my_iterable:
print(item)
🤔 Объяснение
1️⃣Инициализация (`__init__`): Мы создаем объект класса и передаем ему список данных. self.data хранит данные, а self.index отслеживает текущую позицию в последовательности.
2️⃣ Итерация (`__iter__`): Метод __iter__() возвращает сам объект, так как наш класс будет сам итератором.
3️⃣ Следующий элемент (`__next__`): Метод __next__() возвращает следующий элемент в последовательности и увеличивает индекс. Если элементов больше нет, вызывается исключение StopIteration.
🤔 Краткий итог:
1️⃣Определите методы __iter__() и __next__() в вашем классе.
2️⃣ __iter__() должен возвращать объект итератора (обычно self).
3️⃣ __next__() должен возвращать следующий элемент или вызывать StopIteration, если элементов больше нет.
🔥 ТОП ВОПРОСОВ С СОБЕСОВ
🔒 База собесов | 🔒 База тестовых
Available now! Telegram Research 2025 — the year's key insights 
