/ / Кращий спосіб викликати клас, який можна викликати з декількох місць - python, class, factory, instantiation

Найкращий спосіб викликати клас, який можна викликати з кількох місць - python, клас, фабрика, інстанція

У мене є заводський клас і інтерфейс, який викликає цекласу, але цей клас може бути спочатку інстанційно створений з декількох місць в інтерфейсі користувача, тому я зберігав factoryObject у класі UI і для кожної функції, яка може створювати екземпляр класу, який я виконав

if not self.factoryObject:
self.factoryObject = MyFactoryClass()

Це хороша практика кодування або є кращий спосіб зробити це? Дякую.

Відповіді:

1 для відповіді № 1

Чи потрібно мати кілька окремих екземплярів фабричного класу? Якщо ні, просто створіть глобальний синглтон і використовуйте його всюди:

factory = Factory()

В іншому випадку всі наведені нижче опції дозволяють писати код, наприклад:

ui = UI()
ui.factory.make_stuff()

щоб можна було легко перемикатися між цими методами, якщо потрібно.

Добре, вам потрібні окремі фабричні екземпляри. Але чи потрібен вам окремий екземпляр для кожного екземпляра класу інтерфейсу? Якщо ні:

class UI(object):
factory = Factory()

Добре, вам потрібен один завод для кожного інтерфейсу інтерфейсу. Чи дорого коштувати завод? Чи часто у вас є екземпляри інтерфейсу, які ніколи не використовують фабрику? Ви виміряли проблему продуктивності? Якщо відповідь на будь-який з них не відповідає, то, можливо, просто створіть завод, коли ви створюєте інтерфейс користувача:

class UI(object):
def __init__(self):
self.factory = Factory()

Нарешті, відповідь на ваше запитання, якщо ви дійсно хочете ліниво інстанціювати фабрику:

class UI(object):
def __init__(self):
self._factory = None

@property
def factory(self):
if self._factory is None:
self._factory = Factory()
return self._factory

The @property декоратор дозволить вам писати ui.factory.

Якщо ви виявите, що часто пишете цей тип шаблонів у своїх класах і втомилися від цього, розгляньте третю сторону cached_property пакет:

from cached_property import cached_property

class UI(object):

@cached_property
def factory(self):
return Factory()