Лучший способ вызвать класс, который может быть вызван из нескольких мест - PullRequest
0 голосов
/ 07 мая 2018

У меня есть фабричный класс и пользовательский интерфейс, который вызывает этот класс, но этот класс может быть изначально создан из нескольких мест в пользовательском интерфейсе, поэтому я сохранил factoryObject в классе пользовательского интерфейса и для каждой функции, которая может создавать экземпляр фабричного класса. Я сделал

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

Это хорошая практика кодирования или есть лучший способ сделать это? Спасибо.

1 Ответ

0 голосов
/ 07 мая 2018

Вам нужно иметь несколько отдельных экземпляров фабричного класса? Если нет, просто создайте глобальный синглтон и используйте его везде:

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

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

Если вы часто пишете такой тип шаблонов в своих классах и устали от него, подумайте о пакете cached_property третьей стороны:

from cached_property import cached_property

class UI(object):

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