В питоническом комьюнити некоторые призывают отказаться от пользовательских методов
__init__ в контексте dataclasses.До Python 3.7 разработчикам приходилось вручную определять этот метод для инициализации атрибутов экземпляра класса. Например, чтобы создать объект
2DCoordinate(x=1, y=2), необходимо было явно прописать метод __init__ с параметрами x и y. Альтернативы — фабричные функции и абстрактные классы, были менее удобны и приводили к усложнению кода.С появлением «структур данных» необходимость в ручном определении
__init__ для простых структур данных отпала:
from dataclasses import dataclass
@dataclass
class Person:
name: str
age: int
person = Person(name="Alice", age=30)
print(person)
Это не единственное решение: Создание объектов через фабричные методы позволяет (@classmethod) отделить логику инициализации от конструкции объекта.
Вот еще пример проблемы, вызванной пользовательским методом инициализации:
class FooBarWidget(FooWidget):
def __init__(self):
self.publisher = zmq.Context.instance().socket(zmq.PUSH)
self._init()
def _init(self):
def worker_thread_start():
FooWidget.__init__(self)
self.run()
worker_thread = Thread(target=worker_thread_start, daemon=True)
worker_thread.start()
Атрибуты, инициализируемые в
FooWidget.__init__, могут быть недоступны в основном потоке до завершения инициализации в дочернем потоке, что вызывает ошибки при обращении к ним.#основы
@zen_of_python