本篇文章给大家带来的内容是关于Python元类下单例模式的使用介绍(代码示例) ,有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助。
1、什么是Python元类
2、什么是单例模式
单例模式(Singleton pattern)是一种常用的软件设计模式。在它的核心结构中只包含一个被称为单例的特殊类。通过单例模式可以保证系统中一个类只有一个实例而且该实例易于外界访问,从而方便对实例个数的控制并节约系统资源。如果希望在系统中某个类的对象只能存在一个,单例模式是最好的解决方案。
如何保证一个类只有一个实例并且这个实例易于被访问呢?定义一个全局变量可以确保对象随时都可以被访问,但不能防止我们实例化多个对象。一个更好的解决办法是让类自身负责保存它的唯一实例。这个类可以保证没有其他实例被创建,并且它可以提供一个访问该实例的方法。这就是单例模式的模式动机。
3、利用__new__实现单例
# -*- coding: utf8 -*- class Singleton(object): def __init__(self): print 'entrance of __init__' def __new__(cls, *args, **kwargs): if not hasattr(cls, '_instance'): cls._instance = super(Singleton, cls).__new__(cls, *args, **kwargs) return cls._instance if __name__ == '__main__': s1 = Singleton() s2 = Singleton() print s1, s2
Python中通常利用__new__函数实现单例模式。__new__函数负责构造对象,类似于C 中的构造函数。因此为了使类只能创建一个实例对象,我们可以重载__new__函数的行为,使其只能构造一个实例。在上述代码中,给Singleton类赋予了一个_instance属性,如果_instance属性为None则创建实例对象,并使_instance属性引用(指向)该对象,否则直接返回_instance所引用的对象。因此代码中的s1和s2实际上引用了同一个内存对象。
4、利用元类__call__实现单例
# -*- coding: utf8 -*- # 单例模式 class SingletonMetaClass(type): def __init__(cls, *args, **kwargs): """ 初始化类 :param args: :param kwargs: """ print 'MetaClass.__init__ called' print cls._instance super(SingletonMetaClass, cls).__init__(*args, **kwargs) def __new__(cls, name, bases, attrs): """ 创建类,负责类的行为和属性的创建 :param name: :param bases: :param attrs: :return: """ print 'MetaClass.__new__ called' # 单例模式 cls._instance = None return type.__new__(cls, name, bases, attrs) # __call__方法其实和类的创建过程和实例化没有多大关系了,定义了__call__方法才能被使用函数的方式执行。 # 被该元类创建的类,属于该元类的一个实例。因此创建其实例的时候,会调用元类的__call_方法 def __call__(cls, *args, **kwargs): """ 使类变为可调用对象 :param args: :param kwargs: :return: """ print 'MetaClass.__call__ called' if cls._instance is None: # 这里会去调用类的__new__函数 cls._instance = super.__call__(SingletonMetaClass, cls).__call__(*args, **kwargs) return cls._instance class A(): __metaclass__ = SingletonMetaClass def __new__(cls, *args, **kwargs): print 'A.__new__ called' return super(A, cls).__new__(cls, *args, **kwargs) if __name__ == '__main__': # 因为类A是SingletonMetaClass的一个实例,执行A()时会调用元类SingletonMetaClass的__call__方法 a1 = A() print a1 a2 = A() print a2
我们知道,在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属性指向该实例,从而实现只有一个实例。下面是一次执行结果:
MetaClass.__new__ called MetaClass.__init__ called None MetaClass.__call__ called A.__new__ called <__main__.A object at 0x00000000036D2EB8> MetaClass.__call__ called <__main__.A object at 0x00000000036D2EB8>
相关推荐:
以上是Python元类下单例模式的使用介绍(代码示例)的详细内容。更多信息请关注PHP中文网其他相关文章!

要在有限的时间内最大化学习Python的效率,可以使用Python的datetime、time和schedule模块。1.datetime模块用于记录和规划学习时间。2.time模块帮助设置学习和休息时间。3.schedule模块自动化安排每周学习任务。

Python在游戏和GUI开发中表现出色。1)游戏开发使用Pygame,提供绘图、音频等功能,适合创建2D游戏。2)GUI开发可选择Tkinter或PyQt,Tkinter简单易用,PyQt功能丰富,适合专业开发。

Python适合数据科学、Web开发和自动化任务,而C 适用于系统编程、游戏开发和嵌入式系统。 Python以简洁和强大的生态系统着称,C 则以高性能和底层控制能力闻名。

2小时内可以学会Python的基本编程概念和技能。1.学习变量和数据类型,2.掌握控制流(条件语句和循环),3.理解函数的定义和使用,4.通过简单示例和代码片段快速上手Python编程。

Python在web开发、数据科学、机器学习、自动化和脚本编写等领域有广泛应用。1)在web开发中,Django和Flask框架简化了开发过程。2)数据科学和机器学习领域,NumPy、Pandas、Scikit-learn和TensorFlow库提供了强大支持。3)自动化和脚本编写方面,Python适用于自动化测试和系统管理等任务。

两小时内可以学到Python的基础知识。1.学习变量和数据类型,2.掌握控制结构如if语句和循环,3.了解函数的定义和使用。这些将帮助你开始编写简单的Python程序。

如何在10小时内教计算机小白编程基础?如果你只有10个小时来教计算机小白一些编程知识,你会选择教些什么�...

使用FiddlerEverywhere进行中间人读取时如何避免被检测到当你使用FiddlerEverywhere...


热AI工具

Undresser.AI Undress
人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover
用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool
免费脱衣服图片

Clothoff.io
AI脱衣机

AI Hentai Generator
免费生成ai无尽的。

热门文章

热工具

螳螂BT
Mantis是一个易于部署的基于Web的缺陷跟踪工具,用于帮助产品缺陷跟踪。它需要PHP、MySQL和一个Web服务器。请查看我们的演示和托管服务。

ZendStudio 13.5.1 Mac
功能强大的PHP集成开发环境

Dreamweaver CS6
视觉化网页开发工具

SublimeText3 英文版
推荐:为Win版本,支持代码提示!

SublimeText3 Linux新版
SublimeText3 Linux最新版