一、单例模式

a、单例模式分为四种:文件,类,基于__new__方法实现单例模式,基于metaclass方式实现

b、类实现如下: class Sigletion(objects):

import time

def __init__(self):

time.sleep(1)

@classmethod

def instance(cls,*args,**kwargs)

if not hasattr(Sigletion,'_instance'):

Sigletion._instance=Sigletion(*args,**kwargs)

return Sigletion._instance

import threading

daf task(arg):

obj=Sigletion.instance()

print(obj)

for i in range(10):

t=threading.Thread(target=task,args=[i,])

t.start()

c、基于__new__方法实现单例模式 import time

import threading

class Singleton(object):

_instance_lock=threading.Lock()

def __init__(self):

pass

def __new__(cls, *args, **kwargs):

if not hasattr(Singleton,"_instance"):

with Singleton._instance_lock:

if not hasattr(Singleton,"_instance"):

Singleton._instance=object.__new__(cls,*args,**kwargs)

return Singleton._instance

obj1=Singleton()

obj2=Singleton()

print(obj1,obj2)

def task(arg):

obj = Singleton()

print(obj)

for i in range(10):

t = threading.Thread(target=task,args=[i,])

t.start()

d、基于metaclass方式实现单例模式

"""

1.对象是类创建,创建对象时候类的__init__方法自动执行,对象()执行类的 __call__ 方法

2.类是type创建,创建类时候type的__init__方法自动执行,类() 执行type的 __call__方法(类的__new__方法,类的__init__方法) # 第0步: 执行type的 __init__ 方法【类是type的对象】

class Foo:

def __init__(self):

pass

def __call__(self, *args, **kwargs):

pass

# 第1步: 执行type的 __call__ 方法

# 1.1 调用 Foo类(是type的对象)的 __new__方法,用于创建对象。

# 1.2 调用 Foo类(是type的对象)的 __init__方法,用于对对象初始化。

obj = Foo()

# 第2步:执行Foodef __call__ 方法

obj()

"""

import threading

class SingletonType(type):

_instace_lock=threading.Lock()

def __call__(cls, *args, **kwargs):

if not hasattr(cls, "_instance"):

with SingletonType._instace_lock:

if not hasattr(cls, "_instance"):

cls._instance = super(SingletonType,cls).__call__(*args, **kwargs)

return cls._instance

class Foo(metaclass=SingletonType):

def __init__(self,name):

self.name=name

obj1 = Foo('name')

obj2 = Foo('name')

print(obj1,obj2)

python中单例模式是什么_Python中单例模式总结相关推荐

  1. python中函数的作用域_Python中的函数作用域

    在python中,一个函数就是一个作用域 name = 'xiaoyafei' def change_name(): name = '肖亚飞' print('在change_name里的name:', ...

  2. python列表怎么写文件_python中以字典为元素的列表怎么写入文本文件

    python如何将列表中的元素添加进字典纵然被命运的铁蹄狠狠践踏,也顽强地长出自己的根芽. 录入自己和另一个人的名字的汉语拼音简写,然后依据标识符中字母的数值两个人,一颗心,依偎的不是爱情而是那小温暖 ...

  3. python中赋值语句的作用_python中return可以使用赋值语句吗?

    在python中,有各种不同类型的语句.一个python程序是由模块构成的;一个模块由一条或多条语句组成;每个语句由不同的表达式组成;表达式可以创建和操作对象.下面来看看python中的语句. 赋值语 ...

  4. python中round函数参数_python中关于round函数的小坑

    round函数很简单,对浮点数进行近似取值,保留几位小数.比如 >>> round(10.0/3, 2) 3.33 >>> round(20/7) 3 第一个参数是 ...

  5. python里的join方法_python中join()方法介绍

    描述 Python join() 方法用于将序列中的元素以指定的字符连接生成一个新的字符串. 语法 join()方法语法: str . join ( sequence ) 参数 sequence -- ...

  6. python常用函数的用法_python中常用函数整理

    1.map map是python内置的高阶函数,它接收一个函数和一个列表,函数依次作用在列表的每个元素上,返回一个可迭代map对象. class map(object):""&qu ...

  7. python中反斜杠_Python中的正斜杠/与反斜杠\

    知识点: 1. "/"左倾斜是正斜杠,"\"右倾斜是反斜杠,可以记为:除号是正斜杠 2. 对于目录分隔符,Unix和Web用正斜杠/,Windows用反斜杠\. ...

  8. python中的元类_Python中的元类(metaclass)

    提问者自称已经掌握了有关Python OOP编程中的各种概念,但始终觉得元类(metaclass)难以理解.他知道这肯定和自身有关,但仍然觉得不太明白,希望大家可以给出一些实际的例子和代码片段以帮助理 ...

  9. python中end 1 意思_python中“end=”是什么意思?_后端开发

    c语言fopen函数的用法_后端开发 在c语言中可以使用"fopen()"函数打开一个文件,该函数用于打开一个文件,其语法是"open("file a" ...

  10. python 通过ip获取城市_python中通过客户端IP拿到所在城市和当地天气信息—附带项目案例...

    首先,需求分析: 1.拿到客户端IP 2.通过IP拿到客户端所在地区 3.通过地区拿到当地天气 4.整合功能,展示给用户 第一步,如何拿到用户IP 我们以Django环境为例 # 客户端的请求,IP信 ...

最新文章

  1. 第一次作业,针对软件工程这门课程提出五个疑问。
  2. 微信小程序把玩(四)应用生命周期
  3. flutter刷新页面_Flutter BottomNavigationBar切换会刷新当前页面解决方
  4. docke容器无法访问宿主主机的端口
  5. 收藏 | 500页阿里、滴滴、快手等公司的大数据最佳实践!PDF限时下载
  6. mybatis中的多对一的查询
  7. Mac:Split文件分割命令
  8. 程序员出差是去干什么_为什么女生不适合做程序员?原来互联网公司女生少,是由于这几点...
  9. 搭建移动端布局框架:整合flex
  10. linux查看磁盘使用情况及每个文件夹占用磁盘大小
  11. qt中如何使用mysql_qt中如何使用mysql 以及静态编译qt中如何加上mysql(1)
  12. 银行服务发布新版价目表 今起按新标准收费
  13. Hyper-V使用手记(一):无法引导安装FreeBSD7
  14. c语言饭卡管理系统_C语言饭卡管理系统(附代码) -
  15. 计算机毕业设计Java安路友汽车租赁(源码+系统+mysql数据库+lw文档
  16. 关于html中reset图片,关于html5中form表单的reset几种用法
  17. 编译 发布 release的apk
  18. python推理拟合函数
  19. Android动画之仿美团加载数据等待时,小人奔跑进度动画对话框(附顺丰快递员奔跑效果)...
  20. 没有人能比快递员更懂通信协议(sig mesh协议栈之网络架构)

热门文章

  1. Excel拼接单元格内容
  2. 《深入分析GCC 》——2.4 shell工具及graphviz绘图工具
  3. [转]Google抛弃了了SOAP API,浮想联翩
  4. 融合中文字形和拼音的预训练模型:ChineseBERT(ACL2021)
  5. java与C语言socket通信(C客户端java服务端)
  6. 漫画 | 为什么程序员干两年后就要跑路?
  7. 互联网热度排行榜你真的了解?
  8. innerText 和 innerHTML的区别
  9. RoboWare官方使用手册
  10. 设置java.library.path不起作用