day24-2 单例模式
单例模式
- 单例模式:基于某种方法实例化多次得到实例是同一个
- 当实例化多次得到的对象中存放的属性都一样的情况,应该将多个对象指向同一个内存,即同一个实例
- 减少内存占用
类内部定义静态方法实现单例模式
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 单例模式的更多相关文章
- python之路,Day24 常用设计模式学习
python之路,Day24 常用设计模式学习 本节内容 设计模式介绍 设计模式分类 设计模式6大原则 1.设计模式介绍 设计模式(Design Patterns) --可复用面向对象软件的基础 ...
- C++实现线程安全的单例模式
在某些应用环境下面,一个类只允许有一个实例,这就是著名的单例模式.单例模式分为懒汉模式,跟饿汉模式两种. 首先给出饿汉模式的实现 template <class T> class sing ...
- 23种设计模式--单例模式-Singleton
一.单例模式的介绍 单例模式简单说就是掌握系统的至高点,在程序中只实例化一次,这样就是单例模式,在系统比如说你是该系统的登录的第多少人,还有数据库的连接池等地方会使用,单例模式是最简单,最常用的模式之 ...
- angular2系列教程(十)两种启动方法、两个路由服务、引用类型和单例模式的妙用
今天我们要讲的是ng2的路由系统. 例子
- java设计模式之--单例模式
前言:最近看完<java多线程编程核心技术>一书后,对第六章的单例模式和多线程这章颇有兴趣,我知道我看完书还是记不住多少的,写篇博客记录自己所学的只是还是很有必要的,学习贵在坚持. 单例模 ...
- 设计模式C#合集--单例模式
单例模式 代码: 第一种: private static Singleton singleton = null; private Singleton() { } public static Singl ...
- 设计模式之单例模式(Singleton)
设计模式之单例模式(Singleton) 设计模式是前辈的一些经验总结之后的精髓,学习设计模式可以针对不同的问题给出更加优雅的解答 单例模式可分为俩种:懒汉模式和饿汉模式.俩种模式分别有不同的优势和缺 ...
- GOF23设计模式之单例模式
·核心作用: -保证一个类只有一个实例,并且提供一个访问该实例的全局访问点. ·常见应用场景: -Windows的Task Manager(任务管理器)就是很典型的单例模式 -Windows的Recy ...
- GJM : C#设计模式(1)——单例模式
感谢您的阅读.喜欢的.有用的就请大哥大嫂们高抬贵手"推荐一下"吧!你的精神支持是博主强大的写作动力以及转载收藏动力.欢迎转载! 版权声明:本文原创发表于 [请点击连接前往] ,未经 ...
- PHP设计模式(四)单例模式(Singleton For PHP)
今天讲单例设计模式,这种设计模式和工厂模式一样,用的非常非常多,同时单例模式比较容易的一种设计模式. 一.什么是单例设计模式 单例模式,也叫单子模式,是一种常用的软件设计模式.在应用这个模式时,单例对 ...
随机推荐
- AutoIt脚本在做自动化操作的时候,如何进行错误捕获?
我的自动化脚本在运行的时候,会生成一个界面,点击该页面上的按钮能够进行自动化操作. 经常遇到的一个问题是: 脚本运行一半,GUI程序出现了异常情况,这个时候,再次点击生成的界面上的按钮,不会有任何反应 ...
- 实现列表两端完全对其text-aligh:justify 和display:inline-block
dispaly:inline-block 对于块级元素,在IE8-下是不兼容的,所以一般不要用在这些元素上,可以用在inline元素上:span text-align:justify实现子元素完全对齐 ...
- Flink架构及其工作原理
目录 System Architecture Data Transfer in Flink Event Time Processing State Management Checkpoints, Sa ...
- 4种java复制文件的方式
尽管Java提供了一个可以处理文件的IO操作类,但是没有一个复制文件的方法.复制文件是一个重要的操作,当你的程序必须处理很多文件相关的时候.然而有几种方法可以进行Java文件复制操作,下面列举出4中最 ...
- Swift3.0 UITextView写反馈界面
效果图 适配用的 SnapKit 使用介绍: http://www.hangge.com/blog/cache/detail_1097.html private func creationTextV ...
- hdoj1097
好久没有遇到过这样的题,似乎记得以前完全就是靠规律啊什么的.... 然后刚刚看到,这不就是快速幂取膜就好了嘛- #include <stdio.h> #include <string ...
- Centos7.2下安装redis&通用键值命令
Centos7.2下安装redis&通用键值命令 Centos7.2下安装redis 官方网站:https://redis.io/ 1.进入/usr/local/src/目录 cd /usr/ ...
- 最短路之Floyd(弗洛伊德)
只有五行的Floyd最短路算法: 核心代码 每次都更新通过k点,然后从i到j的最短路程...
- The Django Book学习笔记 04 模板
如果使用这种方法制作文章肯定不是一个好方法,尽管它便于你理解是怎么工作的. def current_datetime(request): now = datetime.datetime.now() h ...
- Codeforces 1144G(dp)
据说这题是种dp的套路?然后被我国红名神仙(南大Roundgod)贪心了,不过思路上非常相近了,故而可贪吧. 设的dp[i][0]是:如果把第i个数放在上升序列里了,那么下降序列结尾的那个最大是多少: ...