在这之前,先了解super()和__new__()方法

super()方法:

返回一个父类或兄弟类类型的代理对象,让你能够调用一些从继承过来的方法。

它有两个典型作用:

a. 在单继承的类层次结构中,super()可用于引用父类而不显式父类名称,从而使代码更易于维护。

b. 在多重继承中,可以保证公共父类仅被执行一次。

__new__方法:

a.它是一个类级别的静态方法。通常用于控制生成一个新实例的过程。

b.返回的是一个实例化出来的实例

下面为四种实现单例模式的方法

1. 使用__new__方法

class Singleton(object):
def __new__(cls, *args, **kwargs):
if not hasattr(cls, '_instance'):
orig = super(Singleton, cls)
cls._instance = orig.__new__(cls, *args, **kwargs)
rerurn cls._instance class A(Singleton):
pass # 类A即为单例类

2.共享属性

# 创建实例时把所有实例的__dict__指向同一个字典,这样它们都具有相同的属性和方法(类的__dict__存储对象属性)
class Singleton(object):
_state = {}
def __new__(cls, *args, **kwargs):
ob = super(Singleton,cls).__new__(cls, *args, **kwargs)
ob.__dict__ = cls._state
return ob
class B(Singleton):
pass
# 类B即为单例类

3.使用装饰器

def singleton(cls):
instance = {}
def wapper():
if cls not in instance:
instance[cls] = cls(*args, **kwargs)
return instance[cls]
return wapper @singleton
class C:
pass # 类C即为单例类

4.import方法

# 作为Python模块时是天然的单例模式

#创建一个sington.py文件,内容如下:
class Singleton(object):
def foo(self):
pass
mysington = Singleton() # 运用
from sington import mysington
mysington.foo()

Python四种实现单例模式的方法的更多相关文章

  1. javascript四种类型识别的方法

    × 目录 [1]typeof [2]instanceof [3]constructor[4]toString 前面的话 javascript有复杂的类型系统,类型识别则是基本的功能.javascrip ...

  2. jsp中四种传递参数的方法

    jsp中四种传递参数的方法如下: 1.form表单 2.request.setAttribute();和request.getAttribute(); 3.超链接:<a herf="i ...

  3. python 四种数值类型(int,long,float,complex)介绍

    Python支持四种不同的数值类型,包括int(整数)long(长整数)float(浮点实际值)complex (复数),本文章向码农介绍python 四种数值类型,需要的朋友可以参考一下. 数字数据 ...

  4. 【转】python 三种遍历list的方法

    [转]python 三种遍历list的方法 #!/usr/bin/env python # -*- coding: utf-8 -*- if __name__ == '__main__': list ...

  5. JavaScript四种数值取整方法

    一.Math.trunc() 1.定义 Math.trunc()方法去除数字的小数部分,保留整数部分. 2.语法 Math.trunc(value) 3.示例 console.log(Math.tru ...

  6. [Unity-24] Unity的四种载入场景的方法

    Unity官方提供了4种载入场景(scene)的方法.各自是: 1. Application.LoadLevel():同步载入 2. Application.LoadLevelAsync():异步载入 ...

  7. C/C++四种退出线程的方法

    退出线程可以有四种方法: 1.线程函数的return返回(最好这样): 其中用线程函数的return返回, 而终止线程是最安全的, 在线程函数return返回后, 会清理函数内申请的类对象, 即调用这 ...

  8. Android点击Button按钮的四种事件监听方法总结

    首先我们在activity_main.xml里面先定义一个Button空间 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 <RelativeLayout xmlns:a ...

  9. Python 四种数值类型(int,long,float,complex)区别及转换

    Python支持四种不同的数值类型,包括int(整数)long(长整数)float(浮点实际值)complex (复数), 数字数据类型存储数值.他们是不可改变的数据类型,这意味着改变数字数据类型的结 ...

随机推荐

  1. 【Python】—— 获取函数内部变量名称

    原文出处: https://blog.csdn.net/maixiaochai/article/details/88693507 关键语句: func_vars = func.__code__.co_ ...

  2. 用户tokenId

    tokenId表示为:用户登录到成功后,服务端分配给客户端的令牌号,同时下发tokenId的过期时间.下次用户直接持有tokenId,在其过期时间内均可跳过用户登录步骤,直接请求其他服务操作.如果to ...

  3. 【Java安全】关于Java中常用加密/解密方法的实现

    安全问题已经成为一个越来越重要的问题,在Java中如何对重要数据进行加密解密是本文的主要内容. 一.常用的加密/解密算法 1.Base64 严格来说Base64并不是一种加密/解密算法,而是一种编码方 ...

  4. 【ABAP系列】SAP ABAP smartforms设备类型CNSAPWIN不支持页格式ZXXX

    公众号:SAP Technical 本文作者:matinal 原文出处:http://www.cnblogs.com/SAPmatinal/ 原文链接:[ABAP系列]SAP ABAP smartfo ...

  5. echars 柱状图 堆叠状态 --》二次封装

    <template> <!-- 柱状图 堆叠 1. 调用页面引入 import EcharsColumnStack from '@/components/echarsColumnSt ...

  6. mysql常用知识点之limit

    limit函数的应用.limit后面跟整数,如limit 5,表示在结果集中取前5条:limit后跟整数区间,如limit 2,5,表示在结果集中 从第3条开始,取5条数据,第一个整数表示结果集的顺序 ...

  7. django中使用原生的orm

    只有用的时候才能执行

  8. C语言Ⅰ博客作业02

    1. 这个作业属于哪个课程 C语言程序设计Ⅰ 这个作业要求在哪里 https://edu.cnblogs.com/campus/zswxy/CST2019-3/homework/8656 我在这个课程 ...

  9. 面试题:线程A打印1-10数字,打印到第5个数字时,通知线程B

    此题考查的是线程间的通信方式. 可以利用park/unpark实现 可以利用volatile关键字实现 可以利用synchronized结合wait notify实现 可以利用JUC中的CountDo ...

  10. Linux Apache使用CGI

    CGI(Common Gateway Interface,通用网关接口)是网络服务器可以将查询传递到专门的程序中并且在网页上显示结果的标准机制.Apache等服务器默认是支持CGI的,只需要修改一下配 ...