简单了解python单例模式的几种写法

yipeiwu_com6年前Python基础

方法一:使用装饰器

装饰器维护一个字典对象instances,缓存了所有单例类,只要单例不存在则创建,已经存在直接返回该实例对象。

def singleton(cls):
instances = {}
def wrapper(*args, **kwargs):
if cls not in instances:
instances[cls] = cls(*args, **kwargs)
return instances[cls]
return wrapper
@singleton
class Foo(object):
pass
foo1 = Foo()
foo2 = Foo()
print foo1 is foo2

方法二:使用基类

__new__是真正创建实例对象的方法,所以重写基类的__new__方法,以此来保证创建对象的时候只生成一个实例

class Singleton(object):
def __new__(cls, *args, **kwargs):
if not hasattr(cls, '_instance'):
cls._instance = super(Singleton, cls).__new__(cls, *args, **kwargs)
return cls._instance
class Foo(Singleton):
pass
foo1 = Foo()
foo2 = Foo()
print foo1 is foo2 # True

方法三:使用元类

元类(参考:深刻理解Python中的元类)是用于创建类对象的类,类对象创建实例对象时一定会调用__call__方法,因此在调用__call__时候保证始终只创建一个实例即可,type是python中的一个元类。

class Singleton(type):
def __call__(cls, *args, **kwargs):
if not hasattr(cls, '_instance'):
cls._instance = super(Singleton, cls).__call__(*args, **kwargs)
return cls._instance
class Foo(object):
__metaclass__ = Singleton
foo1 = Foo()
foo2 = Foo()
print foo1 is foo2 # True

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持【听图阁-专注于Python设计】。

相关文章

在python中计算ssim的方法(与Matlab结果一致)

如下代码可以计算输入的两张图像的结构相似度(SSIM),结果与matlab计算结果一致 // An highlighted block import cv2 import numpy...

PyQt5每天必学之日历控件QCalendarWidget

PyQt5每天必学之日历控件QCalendarWidget

QCalendarWidget 是日历控件。它允许用户以简单和直观的方式选择日期。 #!/usr/bin/python3 # -*- coding: utf-8 -*- """ P...

python3实现高效的端口扫描

我们通过python-nmap实现一个高效的端口扫描工具,与定时作业crontab及邮件告警结合,可以很好的帮助我们及时发现异常开放的高危端口。当然,该工具也可以作为业务服务端口的可用性...

用生成器来改写直接返回列表的函数方法

用生成器来改写直接返回列表的函数方法

本文是一篇关于《Effective Python》书中一节的学习笔记,记录了示例代码和思路。 如果函数要产生一系列结果,那么最简单的做法就是把这些结果都放在一个列表里返回。 比如我们要查...

python之virtualenv的简单使用方法(必看篇)

什么是virtualenv? virtualenv可以创建独立Python开发环境,比如当前的全局开发环境是python3.6,现在我们有一个项目需要使用django1.3,另一个项目需...