該示例不支持多線程,如果需要支持多線程,需要加鎖
class Lazy(object):
_wrapper = {}
def __init__(self, lazy_object, *args, **kwargs):
self.__dict__["_wrapperobject"] = lazy_object
self.__dict__["args"] = args
self.__dict__["kwargs"] = kwargs
def __getattr__(self, item, *args, **kwargs):
if item in self.__dict__.keys():
return self.__dict__[item]
else:
if self.__dict__["_wrapperobject"] not in self._wrapper.keys():
self.init_object()
return getattr(Lazy._wrapper[self.__dict__["_wrapperobject"]], item, *args, **kwargs)
def __setattr__(self, key, value):
if self.__dict__["_wrapperobject"] not in self._wrapper.keys():
self.init_object()
setattr(Lazy._wrapper[self.__dict__["_wrapperobject"]], key, value)
def init_object(self):
Lazy._wrapper[self.__dict__["_wrapperobject"]] = self._wrapperobject(*self.args, **self.kwargs)
class User:
def __init__(self, x):
print("10000")
self.name = x
self.age = 18
def get_text(self):
print(self.name)
class User2:
def __init__(self, x):
print("10000")
self.name = x
self.age = 18
def get_text(self):
print(self.age)
user = Lazy(User, "libai")
user.get_text()
user1 = Lazy(User, "lili")
user1.get_text()
user2 = Lazy(User2, "lili")
user2.get_text()