我想创建一个类,当第一次使用对象时,它会在后台惰性地初始化对象,但其行为与初始化的对象完全相同.它应该是线程安全的.例如:
In[1]: l = LazyInitializer(list, (1, 2, 3, 4, 5))
In[2]: l.__len__()
5
我目前的实施是:
class LazyInitializer:
def __init__(self, initializer, *args, **kwargs):
self.__initializer = initializer
self.__args = args
self.__kwargs = kwargs
self.__obj = None
self.__lock = Lock()
@property
def _obj(self):
with self.__lock:
if self.__obj is None:
self.__obj = self.__initializer(*self.__args, **self.__kwargs)
return self.__obj
def __getattr__(self, item):
return getattr(self._obj, item)
这适用于常规对象成员(函数和属性类似),但不适用于魔术方法,例如.,
In[2]: l.__len__() # works
5
In[3]: len(l) # doesn't work
---------------------------------------------------------------------------
TypeError Traceback (most recent call last)
<ipython-input-3-e75269d816bd> in <module>
----> 1 len(l)
TypeError: object of type 'LazyInitializer' has no len()
一个特别的解决方案可以是在LazyInitializer
上显式地实现所有可能的魔法方法.然而,难道没有更好的方法吗?