本文摘自php中文网,作者不言,侵删。
本篇文章给大家带来的内容是关于Python元类下单例模式的使用介绍(代码示例) ,有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助。
1、什么是Python元类
参考文章什么是Python元类?Python元类的介绍
2、什么是单例模式
单例模式(Singleton pattern)是一种常用的软件设计模式。在它的核心结构中只包含一个被称为单例的特殊类。通过单例模式可以保证系统中一个类只有一个实例而且该实例易于外界访问,从而方便对实例个数的控制并节约系统资源。如果希望在系统中某个类的对象只能存在一个,单例模式是最好的解决方案。
如何保证一个类只有一个实例并且这个实例易于被访问呢?定义一个全局变量可以确保对象随时都可以被访问,但不能防止我们实例化多个对象。一个更好的解决办法是让类自身负责保存它的唯一实例。这个类可以保证没有其他实例被创建,并且它可以提供一个访问该实例的方法。这就是单例模式的模式动机。
3、利用__new__实现单例
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
|
Python中通常利用__new__函数实现单例模式。__new__函数负责构造对象,类似于C++中的构造函数。因此为了使类只能创建一个实例对象,我们可以重载__new__函数的行为,使其只能构造一个实例。在上述代码中,给Singleton类赋予了一个_instance属性,如果_instance属性为None则创建实例对象,并使_instance属性引用(指向)该对象,否则直接返回_instance所引用的对象。因此代码中的s1和s2实际上引用了同一个内存对象。
4、利用元类__call__实现单例
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 |
|
我们知道,在Python中类也是对象,元类是创建类的类,因此类实际上是元类的实例对象。在Python中,如果一个对象定义了__call__方法,那么该对象为可调用对象,意思是可以用调用函数的形式来调用对象。
Python的__new__方法负责创建对象,__init__方法负责初始化对象。在上述代码中,只有类A被创建后才能创建类A的对象,因此为了先创建出类A,SingletonMetaClass的__new__和__init__方法会首先被执行。当执行语句A()创建类A的对象时,根据__call__方法的定义,由于类A是元类SingletonMetaClass的对象,所以可以预料元类SingletonMetaClass的__call__方法会调用。
因此上述代码中SiingletonMetaClass的__new__和__init__方法仅执行一次,而每次调用A()创建类A的实例时,都会调用SingletonMetaClass的__call__方法。因此为了实现单例模式,我们在元类的__call__方法中判断了cls的_instance属性是否为None,如果为None则调用元类父类(即type)的__call__方法,type.__call__方法会调用类A的__new__方法创建类A的一个实例,然后将_instance属性指向该实例,从而实现只有一个实例。下面是一次执行结果:
1 2 3 4 5 6 7 8 |
|
相关推荐:
Python使用设计模式中的责任链模式与迭代器模式的示例
Python使用redis pool的单例实现方式介绍
以上就是Python元类下单例模式的使用介绍(代码示例)的详细内容,更多文章请关注木庄网络博客!!
相关阅读 >>
更多相关阅读请进入《Python》频道 >>

Python编程 从入门到实践 第2版
python入门书籍,非常畅销,超高好评,python官方公认好书。