调用可以从多个地方调用的 class 的最佳方法

Best way to call a class that can be called from multiple places

我有一个工厂 class 和一个调用此 class 的 UI,但是此 class 最初可以从 [=21= 中的多个位置实例化],所以我将 factoryObject 存储在 UI class 中,并且对于每个可以实例化工厂的函数 class 我已经完成了

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

这是良好的编码习惯,还是有更好的方法?谢谢。

您是否需要多个单独的工厂实例 class?如果没有,只需创建一个全局单例并在任何地方使用它:

factory = Factory()

否则,下面的所有选项都允许您编写如下代码:

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

因此您可以根据需要在这些方法之间轻松切换。

好的,您需要单独的工厂实例。但是 UI class 的每个实例都需要一个单独的实例吗?如果不是:

class UI(object):
    factory = Factory()

好的,每个 UI 实例需要一个工厂。做工厂成本高吗?您是否经常有 UI 个从不使用工厂的实例?你测量过性能问题吗?如果其中任何一个的答案是否定的,您可以在创建 UI:

时创建一个工厂
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

如果你发现自己经常在自己的classes中写这种模式并且厌烦了,可以考虑第三方cached_property包:

from cached_property import cached_property

class UI(object):

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