TG Telegram Group & Channel
Zen of Python | United States America (US)
Create: Update:

Почему все реже встречается __init__

В питоническом комьюнити некоторые призывают отказаться от пользовательских методов __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

Почему все реже встречается __init__

В питоническом комьюнити некоторые призывают отказаться от пользовательских методов __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


>>Click here to continue<<

Zen of Python






Share with your best friend
VIEW MORE

United States America Popular Telegram Group (US)