Python 单例模式讲解
Python 单例模式讲解
本节内容:
- classmethod用途
- 单例模式方法一
- 类__new__方法讲解
- 单例模式方法二
前言:
使用单例方法的好处:对于一个类,多次实例化会产生多个对象,若使用单例模式,第一次实例化创建一个对象,以后在实例化就用第一次创建的对象。
1. classmethod用途
普通的类方法:
def get_no_of_instances(cls_obj):
return cls_obj.no_inst
class Kls(object):
no_inst = 0
def __init__(self):
Kls.no_inst = Kls.no_inst + 1
ik1 = Kls()
print(ik1.no_inst)
ik2 = Kls()
print(ik2.no_inst)
print(get_no_of_instances(Kls))
C:\Python35\python3.exe D:/pycharm/autoclient_cmdb/单例模式.py
1
2
2
静态方法:
class Kls(object):
no_inst = 0
def __init__(self):
Kls.no_inst = Kls.no_inst + 1
@classmethod
def get_no_of_instance(cls_obj):
return cls_obj.no_inst
ik1 = Kls()
ik2 = Kls()
print(ik1.get_no_of_instance())
print(Kls.get_no_of_instance())
C:\Python35\python3.exe D:/pycharm/autoclient_cmdb/单例模式.py
2
2
2.单例模式方法一
注意:这种方法需要告诉使用者,必须按照我的方法创建对象,不能直接obj = Foo()
class Foo():
_i = None @classmethod
def instance(cls):
if cls._i:
return cls._i
else:
obj = Foo()
cls._i = obj
return cls._i #obj = Foo()
obj = Foo.instance()
obj1 = Foo.instance()
3.类的__new__方法讲解
类实例化时,会先执行类中的new方法,然后在执行init方法。
class Foo(object):
def __init__(self):
self.n = 123
print('执行顺序2')
def __new__(cls, *args, **kwargs):
o = object.__new__(cls, *args, **kwargs)
print(o,'执行顺序1')
return o obj = Foo()
print(obj,'执行顺序3')
C:\Python35\python3.exe D:/pycharm/autoclient_cmdb/单例模式.py
<__main__.Foo object at 0x001B5BF0> 执行顺序1
执行顺序2
<__main__.Foo object at 0x001B5BF0> 执行顺序3
4.单例模式方法二
这种方法的好处:对于使用者而言,还是正常的实例化,但是后台还是只会创建一个对象。
class Foo(object):
_i = None
def __init__(self):
self.n = 123
print('执行顺序2')
def __new__(cls, *args, **kwargs): if cls._i:
return cls._i
else:
o = object.__new__(cls, *args, **kwargs)
cls._i = o
#print(o,'执行顺序1')
return cls._i obj1 = Foo()
obj2 = Foo()
Python 单例模式讲解的更多相关文章
- python 单例模式获取IP代理
python 单例模式获取IP代理 tags:python python单例模式 python获取ip代理 引言:最近在学习python,先说一下我学Python得原因,一个是因为它足够好用,完成同样 ...
- python单例模式的实现与优化
python单例模式的实现与优化 阅读目录(Content) 单例模式 实现单例模式的几种方式 1.使用模块 2.使用装饰器 3.使用类 4.基于__new__方法实现(推荐使用,方便) 5.基于me ...
- 设计模式(Python)-单例模式
本系列文章是希望将软件项目中最常见的设计模式用通俗易懂的语言来讲解清楚,并通过Python来实现,每个设计模式都是围绕如下三个问题: 为什么?即为什么要使用这个设计模式,在使用这个模式之前存在什么样的 ...
- python 单例模式
单例模式,也叫单子模式,是一种常用的软件设计模式.在应用这个模式时,单例对象的类必须保证只有一个实例存在 用装饰器方式实现单例模式 #!/usr/bin/python # coding=utf-8 d ...
- Python单例模式
1.单例模式介绍 单例模式,也叫单子模式,是一种常用的软件设计模式.在应用这个模式时, 单例对象的类必须保证只有一个实例存在.许多时候整个系统只需要拥有一个 全局对象,这样有利于我们协调系统整体的行为 ...
- 用python语言讲解数据结构与算法
写在前面的话:关于数据结构与算法讲解的书籍很多,但是用python语言去实现的不是很多,最近有幸看到一本这样的书籍,由Brad Miller and David Ranum编写的<Problem ...
- python 单例模式的四种创建方式
单例模式 单例模式(Singleton Pattern)是一种常用的软件设计模式,该模式的主要目的是确保某一个类只有一个实例存在.当你希望在整个系统中,某个类只能出现一个实例时,单例对象就能派上用场. ...
- python 单例模式的四种实现方法及注意事项
一.模块单例 Python 的模块就是天然的单例模式,因为模块在第一次导入时,会生成 .pyc 文件,当第二次导入时,就会直接加载 .pyc 文件,而不会再次执行模块代码. #foo1.py clas ...
- python 单例模式,一个类只能生成唯一的一个实例,重写__new__方法详解
单例:一个类只能生成唯一的一个实例 每个类只要被实例化了,他的私有属性 '_instance'就会被赋值,这样理解对吗 对 #方法1,实现__new__方法 #并在将一个类的实例绑定到类变量_inst ...
随机推荐
- Spring源码学习:DefaultAopProxyFactory
/* * Copyright 2002-2015 the original author or authors. * * Licensed under the Apache License, Vers ...
- centos 7 安装截图软件shutter
1.解决 epel-release依赖问题 ,执行命令: yum insatll epel-release 2.然后下载nux-dextop-release-0-5.el7.nux.noarch.rp ...
- Linux 下安装nginx的总结 (之前写的有问题))
1. 下载niginx的 tar包 下载路径 http://nginx.org/en/download.html 也可以直接使用命令下载 wget http://nginx.org/download/ ...
- FuelPHP 系列(三) ------ Model 模型
框架封装好的 model 类有几个,按需继承就好. 有:/fuel/core/classes/model/crud.php /fuel/packages/orm/classes/model.php / ...
- 深入理解Java反射+动态代理
答: 反射机制的定义: 是在运行状态中,对于任意的一个类,都能够知道这个类的所有属性和方法,对任意一个对象都能够通过反射机制调用一个类的任意方法,这种动态获取类信息及动态调用类对象方法的功能称为j ...
- WebApplication与WebSite区别
1. WebApplication(Web应用程序)和WebSite(网站)的区别:WebSite是为了兼容从ASP转过来的开发人员的习惯而存在的,用起来简单,例如:不需要创建命名控件.C#代码修改以 ...
- ES6之Promise用法详解
一 前言 本文主要对ES6的Promise进行一些入门级的介绍.要想学习一个知识点,肯定是从三个方面出发,what.why.how.下面就跟着我一步步学习吧~ 二 什么是Promise 首先是what ...
- pgm7
和 Koller 的 video 最大的不同莫过于书上讲 LBP 的角度不是 procedural 的,而是原理性的.我们先看个 procedural 的,在一般的 cluster graph 上的 ...
- Could not resolve placeholder 'jdbc.driver'
将jdbc.driver=oracle.jdbc.OracleDriver 改成jdbc.driver=oracle.jdbc.driver.OracleDriver 或者反过来修改. ...
- BZOJ4912 [Sdoi2017]天才黑客 【虚树 + 最短路】
题目链接 BZOJ4912 题解 转移的代价是存在于边和边之间的 所以把边看做点,跑最短路 但是这样做需要把同一个点的所有入边和所有出边之间连边 \(O(m^2)\)的连边无法接受 需要优化建图 膜一 ...