xadmin系列之单实例模式
先看下单实例的定义

python的模块实现单例模式是python语言特有的,python的模块天然就是单例的,因为python有个pyc文件,导入一次后,第二次导入直接从pyc中取数据了
这里我们主要学习一下基于模块实现单例对象,这里利用的原理就是python的模块导入的特性,这个模块被第一次导入,会被执行一次,但是如果这个模块被再次导入,无论是在相同的文件还是在不同的文件中,第二次导入都不会再次执行
如果要想通过模块导入实现单实例模式,则必须要在一个文件中定义一个类,这里要切记,在这个文件中一定要实例化这个类,然后在其他文件中导入这个实例对象,那么所有的文件中用的实例对象都是相同的一个
比如我们看下下面的例子
在mysingle.py文件中我们定义了一个类,且实例化了这个类
class func(object):
def foo(self):
print("foo....") s1 = func()
在main.py文件中导入两次mysingle.py文件的实例对象,这里因为导入的都是一个实例,当第一次导入的时候,mysingle.py文件就已经生成pyc文件,所以第二次导入不会在去实现mysingle.py这个文件,而是直接去pyc文件中获取实例变量,所以,我们这里打印实例对象的id,他们肯定是相同的
from mysingle import s1 from mysingle import s1 as new print(id(s1))
print(id(new))
结果两个实例对象的id值当然是相同的
23991472
23991472
我们在看一个例子
我们在func.py这个文件中也导入mysingle.py这个文件的实例对象,导入文件之后,我们定义了一个函数打印导入这个实例对象的内存第一,那么func.py中打印的内存地址和main.py中打印的内存地址也是一样的
我们先看func.py这个文件
from mysingle import s1 def bar():
print(id(s1))
我们在main.py文件中导入上面的func.py文件,然后在main.py文件中执行bar函数
from mysingle import s1 from mysingle import s1 as new print(id(s1))
print(id(new)) from func import bar bar()
这个时候我们打印了三个实例对象的内存地址,毫无疑问,他们的内存地址是相同的
23991472
23991472
23991472
我们看最后一个例子,前面的例子我们都是导入实例好的对象,这次我们导入mysingle.py中的类,然后在实例化这个类,我们得到的实例对象的内存地址是否相同呢,这个当然就不同了,因为每次实例化对象,都会重新开辟一个内存空间,我们前面的例子之所以不需要开辟新的内存空间,是因为我们导入的是一个实例对象
下面的例子我们就是导入类,然后实例化,我们当然可以看到,两个对象的内存地址肯定是不一样的
from mysingle import func f1 = func() f2 = func()
结果当然是不一样的,因为他们是完全不同的两个实例对象
23028752 23990736
为了加深印象,我们在来看一个例子,完全是模仿django来写一个单实例的例子

先看下site中的代码
class Test(object):
_register = {} def register(self,model):
self._register[model] = model() test = Test()
在看app1中的admin的代码
from site import test class Cat(object):
pass # c = Cat()
test.register(Cat) print("------------>第一次",test._register)
在看app2中的admin的代码
from site import test class Dog(object):
pass # d = Dog()
test.register(Dog) print("------------>第二次",test._register)
最后看下main文件的代码
if __name__ == '__main__':
from app1 import admin as admin1
from app2 import admin as admin2
from site import test print("------------>第三次",test._register)
我们最后看下执行main的输出

大家应该能明白了吧
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
单实例还是有其他的实现方式,这里就先不介绍了,因为我也不会,这里我们就先掌握基于模块导入实现单实例对象,这里要切记,在文件中定义一个类,然后必须要实例化这个类,同样,我们在其他位置导入的时候,则必须要导入实例对象,而不是类;实现的效果就是这个类只允许实例出来一个对象
这里在补一个通过__new__方法实现单例模式的代码
class Singloten(object):
_instance = None
def __new__(cls, *args, **kwargs):
if not cls._instance:
cls._instance = super(Singloten,cls).__new__(cls,*args,**kwargs)
return cls._instance class myclass(Singloten):
a = 1 one = myclass()
one.a = 5
two = myclass() print(two.a) print(id(one),id(two))
print(one == two)
输出结果如下

xadmin系列之单实例模式的更多相关文章
- 设计模式之单实例模式(Singleton)
原理:将类的构造函数由pubic变为private或者protect,添加获取对象的public 成员函数,返回指向对象的静态指针. 首先来一段简单的代码实现 代码一 class Singleton ...
- 8.2 GOF设计模式一: 单实例模式 SingleTon
GOF设计模式一: 单实例模式 SingleTon 整个美国,只有一个“现任美国总统” 比如,在学校,“老师”,有数百个:“校长”,只有一个 系统运行时,如何保证某个类只允许实例化一个对象 ...
- Python静态方法实现单实例模式
单实例模式 当程序中需要同一个实例就可以解决问题的场景,可以使用单实例模式
- .Learning.Python.Design.Patterns.2nd.Edition之单实例模式
可以慢慢理解.. 对照JAVA class Singleton(object): def __new__(cls): if not hasattr(cls, 'instance'): cls.inst ...
- [HBase Manual]CH5 HBase运行模式:单实例和分布式
HBase运行模式:单实例和分布式 HBase运行模式:单实例和分布式 1.单实例模式 1.1 单实例在HDFS下 2.分布式 2.1 伪分布式 3完全分布式 HBase有2种运行模式,单实例和分布式 ...
- Java单实例的最佳写法
前言:代码简洁与性能高效无法两全其美,本文章专注于大并发程序的性能,如果您追求代码简洁,本文章可能不太适合,因为本文章主要讨论如何写出在高并发下也能运行很好的代码. 并文章属于Java并发编程实战中例 ...
- Java中的单实例
前几天刚学完单实例设计模式,今天看代码时发现一行代码很奇怪,getRuntime()函数的返回类型怎么是它本身,忽然想起前几天学的单实例模式,于是找到方法的定义,果然是静态私有变量,获取实例的公有方法 ...
- WPF点滴(2) 创建单实例应用程序
最近有同事问道在应用程序启动之后,再次双击应用程序,如何保证不再启动新的应用程序,而是弹出之前已经启动的进程,本质上这就是创建一个单实例的WPF应用程序.在VS的工程树中有一个App.xaml和App ...
- Oracle 单实例数据库安装和real application clusters数据库安装的区别
在想了解Oracle单实例数据可和RAC数据库前,请确保你已经知道了数据库和实例的关系,如果不了解,请参考Oracle 数据库实例和数据库. 单实例数据库模式 单实例模式下,一个数据库只能通过一个实例 ...
随机推荐
- linux集群时间同步搭建
http://xstarcd.github.io/wiki/sysadmin/ntpd.html http://www.voidcn.com/blog/xuxudede1989/article/p-4 ...
- 爬虫--Scrapy-参数等级和请求传参
日志等级 日志等级(种类): ERROR:错误 WARNING:警告 INFO:一般信息 DEBUG:调试信息(默认) 指定输入某一中日志信息: settings:LOG_LEVEL = ‘ERROR ...
- DATASNAP远程方法返回TSTREAM正解(转咏南兄)
DATASNAP远程方法返回TSTREAM正解 DATASNAP远程方法返回TSTREAM,如果数据大小超过32K是会报错的.许多DELPHIER栽在这个上头,甚至开始怀疑TSTREAM返回数据的可行 ...
- 如何用jar命令生成可执行的jar文件
如果你已经把zh.java文件生成了zh.class文件 如果zh.class的路径是bin/com/zhang/zh.class 则在bin目录下放一个manifest.mf文件,文件内容如下: M ...
- ASP.NET 工作流:支持长时间运行操作的 Web 应用程序
ASP.NET 工作流 支持长时间运行操作的 Web 应用程序 Michael Kennedy 代码下载位置:MSDN 代码库 在线浏览代码 本文将介绍以下内容: 独立于进程的工作流 同步和异步活 ...
- 11.枚举类.md
目录 1.定义: 2.枚举类和普通类的区别: 2.1枚举类的简单构建: 2.2枚举类的成员变量.方法和构造 2.3实现接口的枚举类 1.定义: 2.枚举类和普通类的区别: 枚举类的默认修饰符是 pub ...
- C++ vc中怎么使用SendMessage自定义消息函数
vc中怎么使用SendMessage自定义消息函数: SendMessage的基本结构如下:SendMessage( HWND hWnd, //消息传递的目标窗口或线程的句柄. UINT ...
- ShaderLab学习总结
转载 Unity ShaderLab学习总结 Why Bothers? 为什么已经有ShaderForge这种可视化Shader编辑器.为什么Asset Store已经有那么多炫酷的Shader组件可 ...
- server安装
ArcGIS Server Enterprise10 安装过程 1.ArcGIS Server Enterprise10 安装之前先检查下系统有没有安装IIS.右击电脑--管理--服务和应用程序--I ...
- 学习JS的心路历程-参数的传递(下)
今天我们要来探讨JS到底是透过何种参数传递方式呢? 废话不多说,上示例!! 我们先声明原始型别和物件型别来看看两者是否会有不一样的差异: var myStr = 'Hola': var myObj = ...