python装饰器系列(七)

摘要:
Decorator utilization__call__方法实现singleton所谓的singleton意味着一个类的实例自始至终只能创建一次。

装饰器 利用__call__方法实现单例

所谓单例,是指一个类的实例从始至终只能被创建一次。单例的实现有多种,这里以__call__方法来实现

 1 class Single:
 2     __instance = None
 3     
 4     def __init__(self,cls):
 5         self.cls = cls
 6         
 7     def __call__(self,*args,**kwargs):
 8         if self.__instance is None:
 9             self.__instance = self.cls(*args,**kwargs)
10         return self.__instance
1 @Single
2 class Grok1:
3     pass
1 grok1 = Grok1()
2 
3 id(grok1)
4 140271956645592
1 grok2 = Grok1()
2 
3 id(grok2)
4 140271956645592
1 id(grok1) == id(grok2)
2 True

分析一下上边的代码

1 @Single
2 class Grok1:
3     pass
4 grok1 = Grok1()

实例化Grok1类时相当于执行了下边两步:

1 1. Grok1 = Single(Grok1)
2 2. grok1 = Grok1()

第一步:执行Single(Grok1)是返回一个Single类的实例,并用一个变量Grok1指向这个实例对象,此时的Grok1不是class Grok1:里的Grok1类,只是名字相同而已,Single类实例化时__init__构建函数被调用,这里会把self.cls这个实例属性指向Grok1类。

第二步:因Single类实现了__call__方法,所以此实例是一个可调用对象,这里执行grok1 = Grok1(),其中的Grok1已不再是class Grok1:里的类,而是Single类的实例对象,这里调用实例对象就会执行__call__方法

对此方法中的代码做进一步分析:

1 def __call__(self,*args,**kwargs):
2         if self.__instance is None:
3             self.__instance = self.cls(*args,**kwargs)
4         return self.__instance

当第一次调用时,if语句的结果为True,此时会执行self.__instance = self.cls(*args,**kwargs),其中的self.cls指向Grok1类,即这里表示实例化Grok1类,并把self.__instance指向实例化Grok1类的对象,这样__instance就不再是None了,当第二次调用__call__函数时,if语句的结果为False,所以直接执行return self.__instance,所以Grok1这个对象在被多次实例化后指向的实例化对象都是一样的,其实是只被实例化了一次而已

 
 

免责声明:文章转载自《python装饰器系列(七)》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇九、网关(Gateway)AIX逻辑卷扩容下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

Mac-Pycharm中的Terminal(zsh)的python版本和终端python版本不同

python版本不同--mac 突然发现,pycharm 控制台运行python好好地。 但是pycharm中的Terminal无法运行。发现是因为版本不同。 从上面看出来。 本地的python版本是3.7 pycharm解释器调用的也是3.7 但是pycharm的Terminal 中调用的是3.8 我本地貌似是没有3.8 这个版本。 解决办法 mac上...

scrapy爬虫成长日记之将抓取内容写入mysql数据库

前面小试了一下scrapy抓取博客园的博客(您可在此查看scrapy爬虫成长日记之创建工程-抽取数据-保存为json格式的数据),但是前面抓取的数据时保存为json格式的文本文件中的。这很显然不满足我们日常的实际应用,接下来看下如何将抓取的内容保存在常见的mysql数据库中吧。 说明:所有的操作都是在“scrapy爬虫成长日记之创建工程-抽取数据-保存为j...

命令行模式和python交互模式

一、命令行模式 1、是什么 1)Windows系统的cmd 2)Linux系统的terminal 2、作用 运行.py文件 3、格式 解释器+文件名.py 4、工具 1)Windows系统 VScode、Sublime Text、notepad++ 2)Linux系统 Vim文本编辑器 二、python交互模式 1、作用 运行python命令 2、优缺点...

python源码为何都是pass

最近看Python代码  按照一个函数递进的看下去,最后发现,遇到很多源码什么逻辑都没写,仅仅以一个pass  结尾          但却能得到应该得到的结果,这点真的很奇怪,上网查找后 觉得下面的说法还挺符合我的想法,在这里粘贴出来,以后学习深入后继续增加或者修改相关表述: python是C语言实现的,尽管有很多标准库是由python代码实现,但是涉及...

《python深度学习》笔记---3.2-3.3、Keras 简介

《python深度学习》笔记---3.2-3.3、Keras 简介 一、总结 一句话总结: 不处理张量操作:Keras 是一个模型级(model-level)的库,为开发深度学习模型提供了高层次的构建模块。 它不处理张量操作、求微分等低层次的运算 Keras张量操作由后端引擎实现:Keras 有三个后端实现:TensorFlow 后端、 Theano 后端...

(转)Python科学计算之Pandas详解,pythonpandas

https://www.cnblogs.com/linux-wangkun/p/5903380.html-------pandas 学习(1): pandas 数据结构之Series https://www.cnblogs.com/linux-wangkun/p/5903945.html-------pandas 学习(2): pandas 数据结构之Da...