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 100 subscribers, ranking 9 746 in the Technologies & Applications category and 50 691 in the Russia region.
📊 Audience metrics and dynamics
Since its creation on невідомо, the project has demonstrated rapid growth, gathering an audience of 13 100 subscribers.
According to the latest data from 11 June, 2026, the channel demonstrates stable activity. Although there has been a change in the number of participants by -60 over the last 30 days and by -4 over the last 24 hours, overall reach remains high.
- Verification status: Not verified
- Engagement rate (ER): The average audience engagement rate is 9.30%. Within the first 24 hours after publication, content typically collects 5.54% reactions from the total number of subscribers.
- Post reach: On average, each post receives 1 219 views. Within the first day, a publication typically gains 726 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 12 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 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}"
# Создание экземпляра класса
obj = MyClass(10)
# Доступ к словарю атрибутов экземпляра
print(obj.__dict__) # Выведет: {'instance_attr': 10}
# Доступ к атрибуту экземпляра
print(obj.instance_attr) # Выведет: 10
# Вызов метода экземпляра
print(obj.instance_method()) # Выведет: Instance attribute: 10
Атрибуты и методы класса
Хранятся в словаре класса. Этот словарь можно получить через атрибутnt(obj.insсамого класса.
Пример
# Доступ к словарю атрибутов класса
print(MyClass.__dict__)
# Выведет что-то подобное (фактический вывод может варьироваться):
# {
# '__module__': '__main__',
# 'class_attr': 42,
# '__init__': <function MyClass.__init__ at 0x7f941d8e0d30>,
# 'instance_method': <function MyClass.instance_method at 0x7f941d8e0dc0>,
# 'class_method': <classmethod object at 0x7f941d8e0d90>,
# '__dict__': <attribute '__dict__' of 'MyClass' objects>,
# '__weakref__': <attribute '__weakref__' of 'MyClass' objects>,
# '__doc__': None
# }
# Доступ к атрибуту класса
print(MyClass.class_attr) # Выведет: 42
# Вызов метода класса
print(MyClass.class_method()) # Выведет: Class attribute: 42
Динамическое добавление атрибутов и методов
Могут быть добавлены динамически как для экземпляра, так и для класса.
Пример для экземпляра
obj.new_attr = "I am new!"
print(obj.__dict__) # Выведет: {'instance_attr': 10, 'new_attr': 'I am new!'}
print(obj.new_attr) # Выведет: I am new!
Пример для класса
def new_class_method(cls):
return "This is a new class method"
MyClass.new_class_method = classmethod(new_class_method)
print(MyClass.new_class_method()) # Выведет: This is a new class method
Атрибуты и методы экземпляра хранятся в словаре __dict__ экземпляра, а атрибуты и методы класса — в словаре с вероятнкласса. Эти словари позволяют динамически добавлять и изменять атрибуты и методы.
👉 Можно посмотреть Примеры как отвечают люди на этот вопрос, или перейти К списку 1096 вопроса на Python разработчика. Ставь 👍 если нравится контент
🔐 База собесов | 🔐 База тестовыхclass MyClass:
def __init__(self, value):
self._protected_value = value
def _protected_method(self):
print(f"Protected method: The value is {self._protected_value}")
def public_method(self):
self._protected_method()
# Создание экземпляра класса
obj = MyClass(10)
# Вызов публичного метода
obj.public_method() # Выведет: Protected method: The value is 10
# Вызов защищенного метода напрямую (возможно, но не рекомендуется)
obj._protected_method() # Выведет: Protected method: The value is 10
В этом примере:
✅Метод _protected_method является защищенным и обозначен одним подчёркиванием перед именем.
✅Атрибут _protected_value также является защищенным и обозначен аналогично.
Почему они используются
1️⃣Соглашение об использовании: Одинарное подчёркивание сигнализирует другим программистам, что метод или атрибут не предназначен для публичного использования.
2️⃣Инкапсуляция: Помогает в организации кода и защите внутренних данных и методов, хотя и не предоставляет строгих ограничений доступа.
3️⃣Наследование: Упрощает создание иерархий классов, где подклассы могут использовать методы и атрибуты, предназначенные только для внутреннего использования.
Правила именования
1️⃣Публичные методы: Нет подчёркиваний в начале имени.
2️⃣Защищённые методы: Одно подчёркивание в начале имени (_method).
3️⃣Приватные методы: Два подчёркивания в начале имени (__method).
Пример для всех типов методов
class MyClass:
def __init__(self, value):
self.value = value
self._protected_value = value * 2
self.__private_value = value * 3
def public_method(self):
print(f"Public method: The value is {self.value}")
self._protected_method()
self.__private_method()
def _protected_method(self):
print(f"Protected method: The value is {self._protected_value}")
def __private_method(self):
print(f"Private method: The value is {self.__private_value}")
# Создание экземпляра класса
obj = MyClass(10)
# Вызов публичного метода
obj.public_method() # Выведет:
# Public method: The value is 10
# Protected method: The value is 20
# Private method: The value is 30
# Вызов защищенного метода напрямую (возможно, но не рекомендуется)
obj._protected_method() # Выведет: Protected method: The value is 20
# Прямой вызов приватного метода приведёт к ошибке
# obj.__private_method() # AttributeError: 'MyClass' object has no attribute '__private_method'
# Доступ к приватному методу через name mangling
obj._MyClass__private_method() # Выведет: Private method: The value is 30
Защищенные методы обозначаются одним подчёркиванием перед именем. Это указывает, что метод предназначен для внутреннего использования в классе и его подклассах, но не обеспечивает строгих ограничений доступа.
👉 Можно посмотреть Примеры как отвечают люди на этот вопрос, или перейти К списку 1096 вопроса на Python разработчика. Ставь 👍 если нравится контент
🔐 База собесов | 🔐 База тестовыхclass MyClass:
def __init__(self, value):
self.value = value
def __private_method(self):
print(f"Private method: The value is {self.value}")
def public_method(self):
self.__private_method()
# Создание экземпляра класса
obj = MyClass(10)
# Вызов публичного метода
obj.public_method() # Выведет: Private method: The value is 10
# Прямой вызов приватного метода приведёт к ошибке
# obj.__private_method() # AttributeError: 'MyClass' object has no attribute '__private_method'
В этом примере:
✅Метод __private_method является приватным и не может быть вызван напрямую извне класса.
Доступ к приватным методам
Хотя позволяет скрывать методы с помощью двойного подчёркивания, это не является абсолютной защитой. Имя метода изменяется по правилу _<имя_класса>__<имя_метода>. Это позволяет, при необходимости, получить доступ к приватным методам:
# Доступ к приватному методу через name mangling
obj._MyClass__private_method() # Выведет: Private method: The value is 10
Почему они используются
1️⃣Инкапсуляция: Помогают скрывать внутреннюю реализацию класса и защищают данные и методы от несанкционированного доступа и изменения.
2️⃣Упрощение интерфейса: Скрывая детали реализации, приватные методы позволяют сосредоточиться на использовании класса через его публичный интерфейс.
3️⃣Предотвращение конфликтов имён: Приватные методы уменьшают вероятность конфликтов имён при наследовании классов.
Правила именования
1️⃣Публичные методы: нет подчёркиваний в начале имени.
2️⃣Защищённые методы: одно подчёркивание в начале имени (_method).
3️⃣Приватные методы: два подчёркивания в начале имени (__method).
Пример для всех типов методов
class MyClass:
def __init__(self, value):
self.value = value
def public_method(self):
print(f"Public method: The value is {self.value}")
def _protected_method(self):
print(f"Protected method: The value is {self.value}")
def __private_method(self):
print(f"Private method: The value is {self.value}")
def access_private_method(self):
self.__private_method()
# Создание экземпляра класса
obj = MyClass(10)
# Вызов публичного метода
obj.public_method() # Выведет: Public method: The value is 10
# Вызов защищённого метода (можно, но не рекомендуется)
obj._protected_method() # Выведет: Protected method: The value is 10
# Вызов приватного метода напрямую приведёт к ошибке
# obj.__private_method() # AttributeError
# Вызов приватного метода через публичный метод
obj.access_private_method() # Выведет: Private method: The value is 10
# Доступ к приватному методу через name mangling
obj._MyClass__private_method() # Выведет: Private method: The value is 10
Приватные методы реализуются с помощью двойного подчёркивания перед именем метода. Это скрывает метод, делая его недоступным напрямую извне класса, и помогает в инкапсуляции и защите данных.
👉 Можно посмотреть Примеры как отвечают люди на этот вопрос, или перейти К списку 1096 вопроса на Python разработчика. Ставь 👍 если нравится контент
🔐 База собесов | 🔐 База тестовых__mro__ или метода mro().
Рассмотрим пример, где два родительских класса имеют методы с одинаковым названием:
class A:
def method(self):
print("Method from class A")
class B:
def method(self):
print("Method from class B")
class C(A, B):
pass
# Создание экземпляра класса C и вызов метода
c = C()
c.method() # Выведет: Method from class A
В данном случае класс C наследует от A и B. При вызове метода method у экземпляра C Python сначала проверяет класс C, затем A (первый родитель) и только потом B (второй родитель). Таким образом, вызывается метод из класса A.
Вы можете проверить порядок MRO следующим образом:
print(C.__mro__)
# Выведет: (<class '__main__.C'>, <class '__main__.A'>, <class '__main__.B'>, <class 'object'>)
Или с помощью метода mro():
print(C.mro())
# Выведет: [<class '__main__.C'>, <class '__main__.A'>, <class '__main__.B'>, <class 'object'>]
Влияние порядка наследования
Если поменять порядок наследования в определении класса C, результат изменится:
class C(B, A):
pass
c = C()
c.method() # Выведет: Method from class B
Теперь метод из класса B будет вызван первым, так как B указан перед A в списке родительских классов.
Можно также переопределить метод в дочернем классе, чтобы явно указать, какой метод использовать:
class C(A, B):
def method(self):
print("Method from class C")
c = C()
c.method() # Выведет: Method from class C
Если нужно вызвать метод из конкретного родительского класса, можно использовать super():
class C(A, B):
def method(self):
super(A, self).method() # Вызывает метод из класса B, так как он идет следующим после A в MRO
c = C()
c.method() # Выведет: Method from class B
Если у родительских классов есть функции с одинаковым названием, использует порядок разрешения методов (MRO) для определения, какой метод вызывать. Вы можете проверить порядок MRO с помощью атрибута mro или метода mro(). Порядок наследования в определении класса влияет на MRO и на то, какой метод будет вызван.
👉 Можно посмотреть Примеры как отвечают люди на этот вопрос, или перейти К списку 1096 вопроса на Python разработчика. Ставь 👍 если нравится контент
🔐 База собесов | 🔐 База тестовыхclass MyClass:
def __init__(self, value):
self.value = value
def public_method(self):
print(f"The value is {self.value}")
# Создание экземпляра класса
obj = MyClass(10)
# Вызов публичного метода
obj.public_method() # Выведет: The value is 10
В этом примере:
✅Метод public_method является публичным, поскольку он определён без каких-либо специальных модификаторов и доступен извне.
Как их отличить
Принято использовать соглашения об именах для различения публичных и непубличных (приватных и защищённых) методов:
1️⃣Публичные методы: не имеют подчёркиваний в начале имени.
2️⃣Защищённые методы: имеют одно подчёркивание в начале имени (_method).
3️⃣Приватные методы: имеют два подчёркивания в начале имени (__method).
Однако следует помнить, что эти соглашения носят рекомендательный характер и не обеспечивают жёсткого ограничения доступа, как в некоторых других языках программирования.
Пример для всех типов методов
class MyClass:
def __init__(self, value):
self.value = value
def public_method(self):
print(f"Public method: The value is {self.value}")
def _protected_method(self):
print(f"Protected method: The value is {self.value}")
def __private_method(self):
print(f"Private method: The value is {self.value}")
def access_private_method(self):
self.__private_method()
# Создание экземпляра класса
obj = MyClass(10)
# Вызов публичного метода
obj.public_method() # Выведет: Public method: The value is 10
# Вызов защищённого метода (можно, но не рекомендуется)
obj._protected_method() # Выведет: Protected method: The value is 10
# Вызов приватного метода напрямую приведёт к ошибке
# obj.__private_method() # АтрибутError
# Вызов приватного метода через публичный метод
obj.access_private_method() # Выведет: Private method: The value is 10
Почему использовать публичные методы
1️⃣Интерфейс для взаимодействия: Публичные методы предоставляют способ взаимодействия с объектом, позволяя выполнять действия или получать данные.
2️⃣Инкапсуляция: Они помогают скрывать внутреннюю реализацию класса, предоставляя только необходимые для пользователя методы.
Публичные методы доступны для вызова из любого места. Они предоставляют интерфейс для взаимодействия с объектом и обычно не имеют подчёркиваний в начале имени.
👉 Можно посмотреть Примеры как отвечают люди на этот вопрос, или перейти К списку 1096 вопроса на Python разработчика. Ставь 👍 если нравится контент
🔐 База собесов | 🔐 База тестовыхself используется в методах экземпляра. В то время как self ссылается на конкретный объект (экземпляр) класса, cls ссылается на сам класс.
Методы класса
Это методы, которые получают сам класс в качестве первого аргумента. Для их создания используется декоратор @classmethod.
Рассмотрим пример:
class MyClass:
class_variable = 0
def __init__(self, value):
self.instance_variable = value
@classmethod
def class_method(cls, increment):
cls.class_variable += increment
print(f"Class variable is now {cls.class_variable}")
# Создание экземпляров
obj1 = MyClass(1)
obj2 = MyClass(2)
# Вызов метода класса
MyClass.class_method(5) # Выведет: Class variable is now 5
obj1.class_method(3) # Выведет: Class variable is now 8
obj2.class_method(2) # Выведет: Class variable is now 10
В этом примере:
✅Класс MyClass: имеет переменную класса class_variable и метод класса class_method.
✅Метод класса class_method: использует cls для доступа и изменения переменной класса.
Почему он используется
1️⃣Доступ к атрибутам класса: Методы класса могут изменять состояние класса, а не конкретного экземпляра.
2️⃣Создание альтернативных конструкторов: Часто используется для создания дополнительных способов инициализации объектов.
Пример:
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)
person2 = Person.from_birth_year("Bob", 1990)
print(person1.name, person1.age) # Выведет: Alice 30
print(person2.name, person2.age) # Выведет: Bob 34
В этом примере:
✅Метод класса from_birth_year использует cls для создания нового объекта Person, рассчитывая возраст на основе года рождения.
cls используется в методах класса для ссылки на сам класс. Он позволяет методам класса изменять состояние класса и создавать альтернативные конструкторы.
👉 Можно посмотреть Примеры как отвечают люди на этот вопрос, или перейти К списку 1096 вопроса на Python разработчика. Ставь 👍 если нравится контент
🔐 База собесов | 🔐 База тестовыхclass Dog:
def __init__(self, name, age):
self.name = name
self.age = age
def bark(self):
print(f"{self.name} is barking")
# Создание объектов класса Dog
dog1 = Dog("Buddy", 3)
dog2 = Dog("Molly", 5)
# Вызов метода объекта
dog1.bark() # Выведет: Buddy is barking
dog2.bark() # Выведет: Molly is barking
В этом примере:
1️⃣Класс Dog: определяет два атрибута (name и age) и один метод (bark).
2️⃣Конструктор init: метод, который вызывается при создании нового объекта. Он инициализирует атрибуты объекта.
3️⃣Объекты dog1 и dog2: создаются на основе класса Dog и являются его экземплярами.
Важные аспекты
1️⃣Атрибуты: данные, хранящиеся в объекте. Например, dog1.name и dog1.age — это атрибуты объекта dog1.
2️⃣Методы: функции, определенные в классе, которые могут быть вызваны для объекта. Например, dog1.bark() вызывает метод bark объекта dog1.
3️⃣Инкапсуляция: механизм объединения данных (атрибутов) и методов для работы с этими данными в одном объекте.
4️⃣Полиморфизм: возможность объектов разного класса предоставлять одинаковый интерфейс для работы.
5️⃣Наследование: возможность создавать новый класс на основе существующего, унаследуя его атрибуты и методы.
Пример с наследованием
class Animal:
def __init__(self, species):
self.species = species
def make_sound(self):
pass
class Dog(Animal):
def __init__(self, name, age):
super().__init__("Dog")
self.name = name
self.age = age
def bark(self):
print(f"{self.name} is barking")
def make_sound(self):
self.bark()
dog1 = Dog("Buddy", 3)
dog1.make_sound() # Выведет: Buddy is barking
В этом примере:
✅Класс Animal является базовым классом.
✅Класс Dog наследует от Animal и добавляет свои методы и атрибуты.
✅Метод make_sound переопределяется в классе Dog для реализации специфического поведения.
Объект класса — это конкретный экземпляр класса с собственными атрибутами и методами. Класс определяет структуру объектов, а объект является конкретной реализацией этой структуры.
👉 Можно посмотреть Примеры как отвечают люди на этот вопрос, или перейти К списку 1096 вопроса на Python разработчика. Ставь 👍 если нравится контент
🔐 База собесов | 🔐 База тестовыхclass A:
def method(self):
print("Method in A")
class B(A):
def method(self):
print("Method in B")
class C(A):
def method(self):
print("Method in C")
class D(B, C):
pass
d = D()
d.method()
В этом примере:
✅Класс A является базовым классом.
✅Классы B и C наследуют от класса A и переопределяют метод method.
✅Класс D наследует от классов B и C.
Когда мы вызываем метод method через экземпляр класса D (d.method()), возникает вопрос: какой именно метод должен быть вызван - из класса B или из класса C? Это и есть проблема ромбовидного наследования.
Решение проблемы ромбовидного наследования
Использует метод разрешения порядка (MRO - Method Resolution Order) для решения этой проблемы. MRO определяет порядок, в котором методы должны вызываться в случае множественного наследования. Для просмотра MRO можно использовать атрибут __mro__ или функцию mro().
print(D.__mro__)
Результат будет следующим:
(<class '__main__.D'>, <class '__main__.B'>, <class '__main__.C'>, <class '__main__.A'>, <class 'object'>)Согласно этому порядку, метод
method будет взят из класса B, так как он идёт первым в MRO. Поэтому при вызове d.method(), выведется:
Method in B
Если классы B и C используют super(), можно правильно вызвать методы всех классов-предков:
class A:
def method(self):
print("Method in A")
class B(A):
def method(self):
print("Method in B")
super().method()
class C(A):
def method(self):
print("Method in C")
super().method()
class D(B, C):
def method(self):
print("Method in D")
super().method()
d = D()
d.method()
Результат выполнения будет:
Method in D Method in B Method in C Method in AВ этом случае методы всех классов вызываются в порядке, определённом MRO. Проблема ромбовидного наследования возникает при множественном наследовании и приводит к неоднозначности, какой метод вызывать. Решает эту проблему с помощью MRO (Method Resolution Order), определяющего порядок вызова методов. 👉 Можно посмотреть Примеры как отвечают люди на этот вопрос, или перейти К списку 1096 вопроса на Python разработчика. Ставь 👍 если нравится контент 🔐 База собесов | 🔐 База тестовых
__init__ и используется для создания нового объекта класса. В метаклассе new позволяет изменять процесс создания класса.
2️⃣`__init__`: Инициализирует класс, после того как он был создан. В метаклассе init используется для модификации созданного класса, например, добавления атрибутов или методов.
3️⃣`__call__`: Позволяет метаклассу контролировать процесс создания экземпляров класса. Он вызывается, когда создаётся новый объект класса.
Рассмотрим пример использования этих методов:
class MyMeta(type):
def __new__(cls, name, bases, dct):
print(f'Creating class {name}')
# Добавление нового атрибута
dct['added_attribute'] = 'I was added by MyMeta'
return super().__new__(cls, name, bases, dct)
def __init__(cls, name, bases, dct):
print(f'Initializing class {name}')
super().__init__(name, bases, dct)
def __call__(cls, *args, **kwargs):
print(f'Creating instance of class {cls.__name__}')
return super().__call__(*args, **kwargs)
class MyClass(metaclass=MyMeta):
def __init__(self):
print('Instance initialized')
# Создание экземпляра класса
instance = MyClass()
print(instance.added_attribute)
В этом примере:
✅Методating insдобавляет новый атрибут added_attribute к классу.
✅Метод init выполняет инициализацию класса и может быть использован для дальнейших модификаций.
✅Метод call контролирует создание экземпляров класса и выполняет необходимые действия при создании нового объекта.
Методы new, init и call в метаклассах используются для управления процессами создания и инициализации классов, а также создания их экземпляров. Они позволяют модифицировать классы на различных этапах их жизненного цикла.
👉 Можно посмотреть Примеры как отвечают люди на этот вопрос, или перейти К списку 1096 вопроса на Python разработчика. Ставь 👍 если нравится контент
🔐 База собесов | 🔐 База тестовыхself, который является ссылкой на экземпляр класса.
Пример реализации методов объекта
class MyClass:
def __init__(self, value):
self.value = value # Инициализация атрибута
def display_value(self):
print(f"The value is: {self.value}") # Метод для вывода значения атрибута
def increment_value(self, amount):
self.value += amount # Метод для увеличения значения атрибута на заданное количество
# Создание экземпляра класса
obj = MyClass(10)
# Вызов методов объекта
obj.display_value() # Выведет: The value is: 10
obj.increment_value(5)
obj.display_value() # Выведет: The value is: 15
Объяснение кода
1️⃣Конструктор __init__:
✅Метод реализуютявляется специальным методом, который вызывается при создании нового экземпляра класса.
✅Он используется для инициализации атрибутов экземпляра.
2️⃣Метод display_value:
✅Этот метод выводит текущее значение атрибута value.
✅Он принимает только один параметр self, который автоматически передаётся при вызове метода у объекта.
3️⃣Метод increment_value:
✅Этот метод увеличивает значение атрибута value на заданное количество.
✅Он принимает два параметра: self и amount, где self — это ссылка на экземпляр, а amount — значение, на которое нужно увеличить value.
Использование self
Это ссылка на текущий экземпляр класса, которая позволяет доступ к его атрибутам и другим методам. Важно использовать self для чтения и изменения атрибутов экземпляра внутри методов.
Методы экземпляра, класса и статические методы
В дополнение к обычным методам объекта, также можно определить методы класса и статические методы.
1️⃣Методы класса:
✅Методы класса используют декоратор @classmethod и принимают первым параметром cls, который является ссылкой на сам класс.
✅Они полезны для работы с атрибутами класса или для создания экземпляров альтернативными способами.
class MyClass:
class_value = 0
def __init__(self, value):
self.value = value
@classmethod
def set_class_value(cls, new_value):
cls.class_value = new_value
# Вызов метода класса
MyClass.set_class_value(10)
print(MyClass.class_value) # Выведет: 10
2️⃣Статические методы:
Статические методы используют декоратор @staticmethod и не принимают ни self, ни cls.
✅Они полезны для функций, которые не зависят от состояния экземпляра или класса.
class MyClass:
@staticmethod
def static_method():
print("This is a static method")
# Вызов статического метода
MyClass.static_method() # Выведет: This is a static method
Методы объекта — это функции, определённые внутри класса, которые работают с данными экземпляра через параметр self. Методы класса и статические методы также могут быть определены с использованием декораторов @classmethod и @staticmethod соответственно.
👉 Можно посмотреть Примеры как отвечают люди на этот вопрос, или перейти К списку 1096 вопроса на Python разработчика. Ставь 👍 если нравится контент
🔐 База собесов | 🔐 База тестовых
Available now! Telegram Research 2025 — the year's key insights 
