Вам нужно иметь несколько отдельных экземпляров фабричного класса? Если нет, просто создайте глобальный синглтон и используйте его везде:
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()