单例模式

  • 单例模式:基于某种方法实例化多次得到实例是同一个
  • 当实例化多次得到的对象中存放的属性都一样的情况,应该将多个对象指向同一个内存,即同一个实例
  • 减少内存占用

类内部定义静态方法实现单例模式

NAME = 'nick'
AGE = 18 class Foo():
__instance = None
def __init__(self, name, age):
self.name = name
self.age = age @classmethod
def eat(cls):
if not cls.__instance:
cls.__instance = cls(NAME, AGE)
return cls.__instance obj1 = Foo.eat()
obj2 = Foo.eat()
obj3 = Foo.eat()
print(obj1 is obj2 is obj3) # 实例化多次得到同一个实例
True
obj4 = Foo('tank',19)
print(obj1.__dict__)
print(obj4.__dict__)
{'name': 'nick', 'age': 18}
{'name': 'tank', 'age': 19}

装饰器实现单例模式

NAME = 'nick'
AGE = 18 def deco(cls):
cls.__instance = cls(NAME, AGE)
def wrapper(*args, **kwargs):
if len(args) == 0 and len(kwargs) == 0:
return cls.__instance
return cls(*args, **kwargs)
return wrapper @deco
class Foo:
def __init__(self, name, age):
self.name = name
self.age = age f = Foo()
print(f.__dict__)
f1 = Foo()
print(f1.__dict__)
print(f == f1)
print("*" * 50)
f2 = Foo('tank', 19)
print(f2.__dict__)
print(f == f2)
{'name': 'nick', 'age': 18}
{'name': 'nick', 'age': 18}
True
**************************************************
{'name': 'tank', 'age': 19}
False

元类实现单例模式

NAME = 'nick'
AGE = 18 class Mymeta(type):
def __init__(self, class_name, class_bases, class_dic):
super(Mymeta, self).__init__(class_name, class_bases,class_dic) self.__instance = self(NAME, AGE) def __call__(self, *args, **kwargs):
if len(args) == 0 and len(kwargs) == 0:
return self.__instance
obj = self.__new__(self)
self.__init__(obj,*args, **kwargs)
return obj class Foo(object,metaclass=Mymeta):
def __init__(self, name, age):
self.name = name
self.age = age f = Foo()
print(f.__dict__)
f1 = Foo()
print(f1.__dict__)
print(f == f1)
print("*" * 50)
f2 = Foo('tank', 19)
print(f2.__dict__)
print(f == f2)
{'name': 'nick', 'age': 18}
{'name': 'nick', 'age': 18}
True
**************************************************
{'name': 'tank', 'age': 19}
False

day24-2 单例模式的更多相关文章

  1. python之路,Day24 常用设计模式学习

    python之路,Day24 常用设计模式学习   本节内容 设计模式介绍 设计模式分类 设计模式6大原则 1.设计模式介绍 设计模式(Design Patterns) --可复用面向对象软件的基础 ...

  2. C++实现线程安全的单例模式

    在某些应用环境下面,一个类只允许有一个实例,这就是著名的单例模式.单例模式分为懒汉模式,跟饿汉模式两种. 首先给出饿汉模式的实现 template <class T> class sing ...

  3. 23种设计模式--单例模式-Singleton

    一.单例模式的介绍 单例模式简单说就是掌握系统的至高点,在程序中只实例化一次,这样就是单例模式,在系统比如说你是该系统的登录的第多少人,还有数据库的连接池等地方会使用,单例模式是最简单,最常用的模式之 ...

  4. angular2系列教程(十)两种启动方法、两个路由服务、引用类型和单例模式的妙用

    今天我们要讲的是ng2的路由系统. 例子

  5. java设计模式之--单例模式

    前言:最近看完<java多线程编程核心技术>一书后,对第六章的单例模式和多线程这章颇有兴趣,我知道我看完书还是记不住多少的,写篇博客记录自己所学的只是还是很有必要的,学习贵在坚持. 单例模 ...

  6. 设计模式C#合集--单例模式

    单例模式 代码: 第一种: private static Singleton singleton = null; private Singleton() { } public static Singl ...

  7. 设计模式之单例模式(Singleton)

    设计模式之单例模式(Singleton) 设计模式是前辈的一些经验总结之后的精髓,学习设计模式可以针对不同的问题给出更加优雅的解答 单例模式可分为俩种:懒汉模式和饿汉模式.俩种模式分别有不同的优势和缺 ...

  8. GOF23设计模式之单例模式

    ·核心作用: -保证一个类只有一个实例,并且提供一个访问该实例的全局访问点. ·常见应用场景: -Windows的Task Manager(任务管理器)就是很典型的单例模式 -Windows的Recy ...

  9. GJM : C#设计模式(1)——单例模式

    感谢您的阅读.喜欢的.有用的就请大哥大嫂们高抬贵手"推荐一下"吧!你的精神支持是博主强大的写作动力以及转载收藏动力.欢迎转载! 版权声明:本文原创发表于 [请点击连接前往] ,未经 ...

  10. PHP设计模式(四)单例模式(Singleton For PHP)

    今天讲单例设计模式,这种设计模式和工厂模式一样,用的非常非常多,同时单例模式比较容易的一种设计模式. 一.什么是单例设计模式 单例模式,也叫单子模式,是一种常用的软件设计模式.在应用这个模式时,单例对 ...

随机推荐

  1. Transformations

    链接 分析:根据操作模拟 /* ID:wanghan PROB:transform LANG:C++ */ #include "iostream" #include "c ...

  2. AutoIt:获取计算机已安装程序列表

    $file = FileOpen(@ScriptDir&"\RegInstalledItems.csv",1) if $file = -1 Then ConsoleWrit ...

  3. IOCP编程小结(上)

    前段时间接手了一个网络游戏前端连接服务器的开发工作,由于服务器需要在windows平台上部署,并且需要处理大量的客户端连接,因此采用IOCP来做为服务器端的编程模型就成了不二选择.虽然我对服务器开发并 ...

  4. B - Mike and Fun

    Time Limit:2000MS     Memory Limit:262144KB     64bit IO Format:%I64d & %I64u Description Mike a ...

  5. WebService之第一天

    1. 定义:webService是一个远程调用技术 远程:相对于本地,不是当前应用服务的.调用:数据交互. 1.1.  业务需求的问题 1.自己想要,但没有

  6. 分析自己遇到的Excel导出报NullpointException问题

    此文已由作者叶富宏授权网易云社区发布. 欢迎访问网易云社区,了解更多网易技术产品运营经验. 昨天一个商务反馈说报价信息导出失败,查看了一下日志发现是导出记录到Excel的时候报了NullpointEx ...

  7. hdoj【1006】【未完待续】

    题意: 时钟的三个指针在两两之间至少D°的时候是开心的,求开心时间占一天的一个百分比. 思路: 我们看到这个百分比有三位小数,精度很高. 一天有24h,24*60min,24*60*60s,那么最小单 ...

  8. SVG动画 -- 描边动画

    代码说明:纯CSS实现,无JS <!DOCTYPE html> <html lang="en"> <head> <meta charset ...

  9. Luogu P4889 kls与flag 【思维/排序】By cellur925

    题目传送门 这题真的一点也不难qwq.只要想出来就没有什么代码难度的qwq. 每个竹竿只可能向左倒或向右倒,把这两种情况都存在数组中,将数组排序,就可以知道最后落在同一位置的有多少竹竿.就可以知道落在 ...

  10. “XXX.Index”不扩展类“System.Web.UI.Page”,因此此处不允许的问题

    “XXX.Index”不扩展类“System.Web.UI.Page”,因此此处不允许的问题 原因:设计页面继承的路径和后台.cs页面类的路径不一致造成的 看下图 这个是设计页面的样式 这个是后台cs ...