Python使用metaclass实现Singleton模式的方法

   本文实例讲述了Python使用metaclass实现Singleton模式的方法。分享给大家供大家参考。具体实现方法如下:

  ?

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23

class Singleton(type):
def __call__(cls, *args, **kwargs):
print "Singleton call"
if not hasattr(cls, 'instance'):
cls.instance = super(Singleton, cls).__call__(*args, **kwargs)
return cls.instance
def __new__(cls, name, bases, dct):
print "Singleton new"
return type.__new__(cls, name, bases, dct)
def __init__(cls, name, bases, dct):
print "Singleton init"
super(Singleton, cls).__init__(name, bases, dct)
class Cache(object):
__metaclass__ = Singleton
def __new__(cls, *args, **kwargs):
print "Cache new"
return object.__new__(cls, *args, **kwargs)
def __init__(cls, *args, **kwargs):
print "Cache init"
def __call__(cls, *args, **kwargs):
print "Cache call"
print Cache()
print Cache()

  输出:

  ?

1
2
3
4
5
6
7
8

Singleton new
Singleton init
Singleton call
Cache new
Cache init
<__main__.Cache object at 0x01CDB130>
Singleton call
<__main__.Cache object at 0x01CDB130>

  希望本文所述对大家的Python程序设计有所帮助。

时间: 2024-09-19 09:19:55

Python使用metaclass实现Singleton模式的方法的相关文章

Python下singleton模式的实现方法_python

很多开发人员在刚开始学Python 时,都考虑过像 c++ 那样来实现 singleton 模式,但后来会发现 c++ 是 c++,Python 是 Python,不能简单的进行模仿. Python 中常见的方法是借助 global 变量,或者 class 变量来实现单件.本文就介绍以decorator来实现 singleton 模式的方法.示例代码如下: ##----------------------- code begin ----------------------- # -*- cod

java Singleton模式

Java Singleton 模式用来保证在运行的应用程序中,一个Class只是实例化一次,也就是只有一个相应的对象存在.在 web 程序中我们会用一个核心的分配功能的Servlet程序,在这里我们就可以运用这种设计模式了.一般Singleton模式通常有几种种形式:第一种形式: 定义一个类,它的构造函数为private的,它有一个static的private的该类变量,在类初始化时实例话,通过一个public的getInstance方法获取对它的引用,继而调用其中的方法.public clas

singleton模式

或许最简单的设计范式就是"单子"(Singleton),它能提供对象的一个(而且只有一个)实例.单子在Java库中得到了应用,但下面这个例子显得更直接一些:   //: SingletonPattern.java // The Singleton design pattern: you can // never instantiate more than one. package c16; // Since this isn't inherited from a Cloneable /

多线程-用c++实现singleton模式。

问题描述 用c++实现singleton模式. 作业:用c++实现singleton模式.具体的该如何下手啊?关于C++多线程的书籍知道的比较好的帮忙推荐一下了.谢谢 解决方案 C++多线程的书籍推荐台湾侯捷的<Win32 多绪程式设计> 解决方案二: class singleton { private: singleton() { } //封闭构造函数 private: static singleton * _instance; // 唯一实例 public: static singleto

Design Pattern: Singleton 模式

一句话概括:保证一个类仅有一个实例,并提供一个访问它的全局访问点. Singleton的英文意义是独身,也就是只有一个人,应用在物件导向语言上,通常翻译作单例:单一个实例(Instance).  很多时候,您会需要Singleton模式,例如印表机管理,您希望程式中只能有一个Print Spooler,以避免两个列印动作同时输入至印表机中:例如资料库管理,因为建立连接(Connection)物件会耗用资源,您希望程式中只能有一个 连接物件,所有其它的程式都透过这个物件来连接资料库,以避免连接物件

Java设计模式之单态模式(Singleton模式)介绍_java

定义:Singleton模式主要作用是保证在Java应用程序中,一个类Class只有一个实例存在. 在很多操作中,比如建立目录 数据库连接都需要这样的单线程操作. 还有,singleton能够被状态化:这样,多个单态类在一起就可以作为一个状态仓库一样向外提供服务,比如,你要论坛中的帖子计数器,每次浏览一次需要计数,单态类能否保持住这个计数,并且能synchronize的安全自动加1,如果你要把这个数字永久保存到数据库,你可以在不修改单态接口的情况下方便的做到. 另外方面,Singleton也能够

AS3中的单件(Singleton)模式

单件(singleton)模式在c#中是最容易实现的模式,其主要用意就在于限制使用者用new来创建多个实例.但在as3中,构造函数必须是public的(语法本身要求的),而且也不能在构造函数中抛出异常(编译可通过,但是逻辑行不通),因为这样相当于把创建实例的路子完全切断了,一个实例也得不到! 错误代码: package{ public class singleton{ static private var _instance:singleton; public function singleto

Design Pattern: Registry of Singleton 模式

一句话概括:您可以使用父类别来统一管理多个继承的子类别之Singleton实例,您可以在需要的时候再向父类别注册子类 Singleton,必要时随时调整传回的子类别Singleton. 考虑使用 Singleton 模式 时拥有子类别的问题,在Singleton模式中的getInstance()通常是一个静态方法,不能在子类别中重新定义它,关于子类别实例的产生交由getInstance()来进行是最好的选择,例如: public class Singleton { private static

Python中操作列表之List.append()方法的使用

  这篇文章主要介绍了在Python中操作列表之List.append()方法的使用,是Python入门学习中的基础知识,需要的朋友可以参考下 append()方法追加传递obj到现有的列表. 语法 以下是append()方法的语法: ? 1 list.append(obj) 参数 obj -- 这是在列表中要追加的对象. 返回值 此方法不返回任何值,但更新现有的列表. 例子 下面的例子显示了append()方法的使用. ? 1 2 3 4 5 #!/usr/bin/python   aList