单例模式:即一个类有且仅有一个实例。

那么通过python怎么实现一个类只能有一个实例呢。

class Earth:
"""
假如你是神,你可以创造地球
"""
print '欢迎来到地球' # 生成一个地球
a = Earth()
print id(a) # 再生成一个地球
b = Earth()
print id(b)

输出:

欢迎来到地球
53356616
59869960

从上面例子可以看到,地球被创建了两次,因为地球只能有一个,所以Earth类只能有一个实例,所以需要单例模式实现。

python中,一个类创建对象实例是通过调用父类object的 __new__(cls)方法来创建对象的

我们可以通过重写 __new__(cls)方法去实现类只创建一个实例,再创建的实例返回上一次的对象的引用。

class Earth(object):
"""
假如你是神,你可以创造地球
"""
# 定义一个类属性做判断
instance = None def __new__(cls, *args, **kwargs):
# 如果instance为空则说明是第一次创建实例
# 通过父类的__new__(cls)创建实例
if cls.instance == None:
# 调用父类的__new__(cls)方法创建实例,并将该实例赋值给类变量instance,此时该变量的值从None变为该实例
cls.instance = object.__new__(cls)
# print cls.instance
# 返回实例化对象
return cls.instance
else:
# 返回上一个对象的引用
return cls.instance # print '欢迎来到地球' print '原始的instance值为:%s' % Earth.instance # 生成一个地球
a = Earth()
# 创建实例后的instance值
print '创建实例后的instance值为:%s' % Earth.instance
print id(a) # 再生成一个地球
b = Earth()
print id(b)

输出:

原始的instance值为:None
创建实例后的instance值为:<__main__.Earth object at 0x0000000003090E10>
50925072
50925072

可以看到两次的id相同,为同一个对象

参考:https://blog.csdn.net/CtyCt_/article/details/79677125

多种实现单例模式:https://www.cnblogs.com/huchong/p/8244279.html

python:单例模式--使用__new__(cls)实现的更多相关文章

  1. python 单例模式获取IP代理

    python 单例模式获取IP代理 tags:python python单例模式 python获取ip代理 引言:最近在学习python,先说一下我学Python得原因,一个是因为它足够好用,完成同样 ...

  2. python 单例模式,一个类只能生成唯一的一个实例,重写__new__方法详解

    单例:一个类只能生成唯一的一个实例 每个类只要被实例化了,他的私有属性 '_instance'就会被赋值,这样理解对吗 对 #方法1,实现__new__方法 #并在将一个类的实例绑定到类变量_inst ...

  3. Python中使用__new__实现单例模式并解析

    阅读文章前请先阅读 Python中类方法.__new__方法和__init__方法解析 单例模式是一个经典设计模式,简要的说,一个类的单例模式就是它只能被实例化一次,实例变量在第一次实例化时就已经固定 ...

  4. python 中的__new__方法

    1.有关__new__方法的介绍 __new__方法调用在构造方法构造实例之前,即在__init__方法执行之前,我们可以这样理解,他的作用是决定是否适用这个__iint__方法来构造实例,但是需要注 ...

  5. python 单例模式的四种实现方法及注意事项

    一.模块单例 Python 的模块就是天然的单例模式,因为模块在第一次导入时,会生成 .pyc 文件,当第二次导入时,就会直接加载 .pyc 文件,而不会再次执行模块代码. #foo1.py clas ...

  6. Python系列之 __new__ 与 __init__

    很喜欢Python这门语言.在看过语法后学习了Django 这个 Web 开发框架.算是对 Python 有些熟悉了.不过对里面很多东西还是不知道,因为用的少.今天学习了两个魔术方法:__new__ ...

  7. python中的__new__、__init__和__del__

    __new__.__init__.__del__三个方法用于实例的创建和销毁,在使用python的类中,我们最常用的是__init__方法,通常称为构造方法,__new__方法几乎不会使用,这篇文章是 ...

  8. Python 单例模式讲解

    Python 单例模式讲解 本节内容: classmethod用途 单例模式方法一 类__new__方法讲解 单例模式方法二 前言: 使用单例方法的好处:对于一个类,多次实例化会产生多个对象,若使用单 ...

  9. 设计模式(Python)-单例模式

    本系列文章是希望将软件项目中最常见的设计模式用通俗易懂的语言来讲解清楚,并通过Python来实现,每个设计模式都是围绕如下三个问题: 为什么?即为什么要使用这个设计模式,在使用这个模式之前存在什么样的 ...

随机推荐

  1. Ubuntu创建启动器(快捷方式)的方式

    解压.tar.gz的navicat之后发现不能自动生成启动器了,研究了一下发现: 虽然不少带有图形界面的程序会在安装时自动在桌面上创建快捷方式,还有一些图形界面程序或者命令行程序可能需要你手动创建快捷 ...

  2. 用mingw32编译ffmpeg2.7

    1.  下载x265最新源码:      下载ffmpeg源码(我用的是2.7):      下载cmake最新版本并安装:      下载SDL(我用的SDL-1.2.15):      下载min ...

  3. 项目Alpha冲刺--9/10

    项目Alpha冲刺--9/10 作业要求 这个作业属于哪个课程 软件工程1916-W(福州大学) 这个作业要求在哪里 项目Alpha冲刺 团队名称 基于云的胜利冲锋队 项目名称 云评:高校学生成绩综合 ...

  4. Python语言程序设计(3)--字符串类型及操作--time库进度条

    1.字符串类型的表示: 三引号可做注释,注释其实也是字符串 2.字符串的操作符 3.字符串处理函数 输出:

  5. 20-ESP8266 SDK开发基础入门篇--C# TCP客户端编写 , 加入数据通信

    https://www.cnblogs.com/yangfengwu/p/11192594.html 自行调整页面 连接上以后主动发个数据 namespace TCPClient { public p ...

  6. Luogu5206 【WC2019】数树 【容斥,生成函数】

    题目链接 第一问白给. 第二问: 设 \(b=y^{-1}\),且以下的 \(Ans\) 是除去 \(y^n\) 的. 设 \(C(T)\) 是固定了 \(T\) 中的边,再连 \(n-|T|-1\) ...

  7. CDH CM版本 6.0.1 升级到 CM 6.2.0 当前最新版本(CentOS 7.x)

    CDH 的 6.0.1 是一个尴尬的版本,那时候 cloudera 还没有将 spark 更新到 2.4 还使用的是 spark 2.2版本. 但后来我们发现 2.3 | 2.4 更新了非常多的 fe ...

  8. Zuul超时配置

    在实际运用过程中,发现有时候zuul的第一次请求经常会超时.不知道你们怎样,我经常在重启zuul后,第一次访问经常会出现超时现象,但是第二次访问就不会了. 第一次经常超时 这是因为zuul采用了懒加载 ...

  9. mysql 字段添加以及删除

    mysql> select * from user; +------+-----------+-----------+ | id | name | address | +------+----- ...

  10. mysql 通配符%以及_

    %匹配任意长度 _ 匹配单个字符 mysql> select * from table1; +----------+------------+-----+-------------------- ...