飘逸的python - 单例模式乱弹
方法一:装饰器
利用“装饰器只会执行一次”这个特点
- def singleton(cls):
- instances = []# 为什么这里不直接为None,因为内部函数没法访问外部函数的非容器变量
- def getinstance(*args, **kwargs):
- if not instances:
- instances.append(cls(*args, **kwargs))
- return instances[0]
- return getinstance
- @singleton
- class Foo:
- a = 1
- f1 = Foo()
- f2 = Foo()
- print id(f1), id(f2)
方法二:基类
利用“类变量对所有对象唯一”,即cls._instance
- class Singleton(object):
- def __new__(cls, *args, **kwargs):
- if not hasattr(cls, '_instance'):
- cls._instance = object.__new__(cls, *args, **kwargs)
- return cls._instance
- class Foo(Singleton):
- a = 1
方法三:metaclass
利用“类变量对所有对象唯一”,即cls._instance
- class Singleton(type):
- def __call__(cls, *args, **kwargs):
- if not hasattr(cls, '_instance'):
- cls._instance = super(Singleton, cls).__call__(*args, **kwargs)
- return cls._instance
- class Foo():
- __metaclass__ = Singleton
方法四:Borg模式
利用“类变量对所有对象唯一”,即__share_state
- class Foo:
- __share_state = {}
- def __init__(self):
- self.__dict__ = self.__share_state
方法五:利用import
利用“模块只会被import一次”
- #在文件mysingleton中
- class Foo(object):
- pass
- f = Foo()
然后在其它模块,from mysingleton import f
直接拿f当作单例的对象来用
飘逸的python - 单例模式乱弹的更多相关文章
- 飘逸的python - __new__、__init__、__call__傻傻分不清
__new__: 对象的创建,是一个静态方法.第一个參数是cls.(想想也是,不可能是self,对象还没创建,哪来的self) __init__ : 对象的初始化, 是一个实例方法,第一个參数是sel ...
- 飘逸的python - 性能调优利器profile及其意义
VIM 的作者Bram Moolenaar在一篇叫高效文本编辑器的7个习惯的ppt中有这么一段话. Three basic steps 1. Detect inefficiency 2. ...
- python 单例模式获取IP代理
python 单例模式获取IP代理 tags:python python单例模式 python获取ip代理 引言:最近在学习python,先说一下我学Python得原因,一个是因为它足够好用,完成同样 ...
- Python 单例模式讲解
Python 单例模式讲解 本节内容: classmethod用途 单例模式方法一 类__new__方法讲解 单例模式方法二 前言: 使用单例方法的好处:对于一个类,多次实例化会产生多个对象,若使用单 ...
- python单例模式的实现与优化
python单例模式的实现与优化 阅读目录(Content) 单例模式 实现单例模式的几种方式 1.使用模块 2.使用装饰器 3.使用类 4.基于__new__方法实现(推荐使用,方便) 5.基于me ...
- python 单例模式
单例模式,也叫单子模式,是一种常用的软件设计模式.在应用这个模式时,单例对象的类必须保证只有一个实例存在 用装饰器方式实现单例模式 #!/usr/bin/python # coding=utf-8 d ...
- Python单例模式
1.单例模式介绍 单例模式,也叫单子模式,是一种常用的软件设计模式.在应用这个模式时, 单例对象的类必须保证只有一个实例存在.许多时候整个系统只需要拥有一个 全局对象,这样有利于我们协调系统整体的行为 ...
- python 单例模式的四种创建方式
单例模式 单例模式(Singleton Pattern)是一种常用的软件设计模式,该模式的主要目的是确保某一个类只有一个实例存在.当你希望在整个系统中,某个类只能出现一个实例时,单例对象就能派上用场. ...
- python 单例模式的四种实现方法及注意事项
一.模块单例 Python 的模块就是天然的单例模式,因为模块在第一次导入时,会生成 .pyc 文件,当第二次导入时,就会直接加载 .pyc 文件,而不会再次执行模块代码. #foo1.py clas ...
随机推荐
- 机器学习(二十三)— L0、L1、L2正则化区别
1.概念 L0正则化的值是模型参数中非零参数的个数. L1正则化表示各个参数绝对值之和. L2正则化标识各个参数的平方的和的开方值. 2.问题 1)实现参数的稀疏有什么好处吗? 一个好处是可以简化 ...
- algorithm 简单用法
algorithm 简单用法 #include <iostream> #include <vector> #include <algorithm> using na ...
- BEC listen and translation exercise 33
In fact, if it is a really hot day, like the sort of weather we had last summer, you are advised to ...
- I.MX6 Busybox watchdog
/************************************************************************* * I.MX6 Busybox watchdog ...
- C#连接solr时提示 java内存异常 (jetty和tomcat哪个更High) java.lang.OutOfMemoryError
C#连接solr时提示 java内存异常 java.lang.OutOfMemoryError 时间:20180130 09:51:13.329,消息:异常消息<?xml version=& ...
- 洛谷【P1619】 解一元二次方程的烦恼
我对模拟的理解:https://www.cnblogs.com/AKMer/p/9064018.html 题目传送门:https://www.luogu.org/problemnew/show/P16 ...
- CF1060B:Maximum Sum of Digits
我对贪心的理解:https://www.cnblogs.com/AKMer/p/9776293.html 题目传送门:http://codeforces.com/problemset/problem/ ...
- BZOJ1720:[Usaco2006 Jan]Corral the Cows 奶牛围栏
我对二分的理解:https://www.cnblogs.com/AKMer/p/9737477.html 题目传送门:https://www.lydsy.com/JudgeOnline/problem ...
- 【转】mysql查询当天所有数据sql语句
mysql查询当天的所有信息: select * from test where year(regdate)=year(now()) and month(regdate)=month(now()) a ...
- HDOJ2043(JAVAset容器练习)
import java.io.PrintWriter; import java.util.HashSet; import java.util.Scanner; public class Main { ...