在这之前,先了解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()

最新文章

  1. MySQL Range Optimization
  2. html/CSS基础知识回顾
  3. Oracle 数据同步系列--触发器
  4. php实现的IMEI限制的短信验证码发送类
  5. Objective-C 笔记二 类、对象和方法
  6. HDU 2719 The Seven Percent Solution
  7. iOS 将UIColor转换为UIImage
  8. 201521123121 《Java程序设计》第11周学习总结
  9. 腾讯x5Webview取代原生android Webview
  10. ROS_Kinetic_x 基於ROS和Gazebo的RoboCup中型組仿真系統(多機器人協作)
  11. QMQ去哪儿网-mq中间件(启动失败)
  12. .NET-ORM框架EF-Code First代码优先
  13. c++文件的读写
  14. eclipse中添加server后,启动server,访问项目时,端口是怎么选择的。
  15. mysql distinct 用法详解及优化
  16. python 连接 oracle 统计指定表格所有字段的缺失值数
  17. 201. Spring Boot JNDI:Spring Boot中怎么玩JNDI
  18. 6月17 练习ThinkPHP的增删改查
  19. 连接Hive的客户端界面工具–SQuirrel SQL Client
  20. Mongodb数据结构及与MySql对比

热门文章

  1. 苏州Uber优步司机奖励政策(3月28日~3月30日)
  2. you selected does not support x86-64 instruction set
  3. coolshell里的一些c++文章
  4. 使用union 外加count
  5. 远离服务器宕机,腾讯WeTest正式推出服务器深度性能测试服务
  6. MySQL数据库优化方法
  7. Qt-QML-Button-ButtonStyle-实现鼠标滑过点击效果
  8. spark写入ES(动态模板)
  9. OpenMPI源码剖析1:MPI_Init初探
  10. 吴恩达深度学习 反向传播(Back Propagation)公式推导技巧