调用可以从多个地方调用的 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()
我有一个工厂 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()