python 类初始化_Python懒加载:当真正用到这个类时,才去初始化这个类

最近做的项目,由于项目启动时,会去实例化一个类,而这个类初始化会去加载模型,这样导致项目启动的时候特别慢,特别是使用python manage.py *的一些命令时,有时会超时失败,这个时候就想到了懒加载,当真正使用到这个类时,才去初始化这个类。

daf171c92125bf16f6417228ff383c5a.png

先来看一下python当中没有使用懒加载的类是怎么初始化的,写这么一类如下:

class LoadModel(object): def __init__(self): print('加载模型开始。。。') print('耗时2分钟。。。。') print('加载模型完毕。。。') def tts(self, text): print('合成文本是:%s', text) print('请求模型,文本转语音。。。')if __name__ == '__main__': load_model = LoadModel()

运行一下,结果如下:

111d87b74c1710232aef3b2859dbf42c.png

可见python中的类实例化时,就进行了初始化,这点和Java中的类的实例化步骤是一样的,但是现在不想去初始化,而是调用里面的tts()方法时再去初始化,再去加载模型。

72fc26ea879e4d7917c95b1f76cc4f3e.png

这时我们就要从初始化这块来下手了,可以看出,上面的LoadModel这个类继承了object这个类,这也是和Java中是一样的,继承了父类,父类的实例化机制也就导致了子类的实例化机制,遗传的原因,所以我们去改造父类,这不是说去改造object,这是祖先,不能随便动的,咱们去写一个懒加载的类,然后所有想去懒加载的类,都去继承这个父类,代码如下:

class LazyProxy(object): def __init__(self, cls, *args, **kwargs): self.__dict__['_cls'] = cls self.__dict__['_params'] = args self.__dict__['_kwargs'] = kwargs self.__dict__["_obj"] = None def __getattr__(self, item): if self.__dict__['_obj'] is None: self._init_obj() return getattr(self.__dict__['_obj'], item) def __setattr__(self, key, value): if self.__dict__['_obj'] is None: self._init_obj() setattr(self.__dict__['_obj'], key, value) def _init_obj(self): self.__dict__['_obj'] = object.__new__(self.__dict__['_cls']) self.__dict__['_obj'].__init__(*self.__dict__['_params'], **self.__dict__['_kwargs'])class LazyInit(object): def __new__(cls, *args, **kwargs): return LazyProxy(cls, *args, **kwargs)

想去懒加载的类就去继承LazyInit这个类,从上面代码看,LazyInit这个类实例化时,返回一个LazyProxy对象,而LazyProxy对象初始化时,把_obj对应的字典值设为None,当真正使用的使用,才去调用_init_obj()的方法去初始化这个类,下面代码演示一下:

7fd3d43a59ea9fb579ece7ba2e0420df.png

可以看出,当我们实例化LoadModel这个类时,它并没有去初始化,这已经达到目的的一半了,另外一半就是,当我们第一次调用LoadModel中的方法时,它会去初始化吗?答案揭晓如下:

1c507ad13a1e78747faee7dbcc3078ae.png

很显然,初始化了,那么多次调用方法,它会不会多次初始化呢:

3da6d06681f8ce92d01d3ceee9121f25.png

完美,简单的python实例化类的懒加载已经实现了!

af9bbb61b4196905135fe4113df7d194.png
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值