Singleton In Python

NGloom 发表于 2008-07-10 12:31:31

半年没有往这个目录里加东西了吧,今天来吹吹灰,咳咳..
从网上找到的找到的讲Python的设计模式东东,原址如下:
http://www.python.org/workshops/1997-10/proceedings/savikko.html
===============================================

Python里类没有Private方法,所以要用单例模式的时候不能通过禁用到构造方法来实现对新实例产生的封锁.
C++中的单例:
class Singleton {
public:
static Singleton& Handle();
private:
static Singleton* psingle;
//构造方法,拷贝构造函数私有化
Singleton();
Singleton( const Singleton& );
Singleton& operator=( const Singleton& );
};

Singleton& Singleton::Handle()
{
if( !psingle ) {
psingle = new Singleton;
}
return *psingle;
}


===================================
# Python 版实现

#Singleton的基类
class Singleton:
__single = None #类变量
def __init__( self ):
if Singleton.__single:
raise Singleton.__single #通过生成一个异常来实现对构造函数访问的控制
Singleton.__single = self


#一个Singleton的子类
class Child( Singleton ):
def __init__( self, name ):
Singleton.__init__( self )#注意这里,由于有了新的构造函数,这里要对父类的构造函数做出调用
self.__name = name
def name( self ):
return self.__name

#另一个Singleton的子类
class Junior( Singleton ):
pass #这里Junior的默认构造函数会自动调用Singleton的构造函数
#申请Singleton及其子类单例的方法,
#默认申请到的是Singleton的单例
def getInstance( x = Singleton ):
try:
single = x()
except Singleton, s:
single = s
return single
得到单例调用如下:
a = getInstance()
b = Child('Tom')
=====================
其实看的出,还是有蛮多问题的,
首先,这个Child的构造方法还是可以从外部调用的,不过这个是Python语言决定的吧(没有private的后果),而且从构造方法得到一个实例逻辑上也说得过去,但是当你第二次调用Child的时候问题就来了.
其次,这个getInstance()得到Child的时候怎么加参数啊?倒是可以Child加默认参数,再用setName()之类的方法去修改
最后,虽然有三个类单例的类(Singleton,Child,Junior),但其实Singleton从头到尾都只能有一个实例(因为Singleton.__single只有一个),而不是想像中的一个类一个实例,不过可以考虑一下修改一下,实现一个类最多一个实例,嗯

=========================
睡一觉醒来把Singleton改了一下,现在Singleton和Singleton的子类分别只能有一个实例了..
class Singleton:
    __single = {}
    def __init__( self ):
        if Singleton.__single.has_key(self.__class__):
            raise Singleton.__single[self.__class__] 
        Singleton.__single[self.__class__] = self  
        print 'creat a instance in',self.__class__


将每个类的不同实例放在__single里,嗯~
大家have fun~

关键词(Tag): python singleton design_pattern


收藏: QQ书签 del.icio.us 订阅: Google 抓虾

最新评论

  • 2008-07-10 22:39:17

    你适合写本effective pathon之类的书,呵呵。 给你推荐一部电影
    《牛津杀手》,关于哲学和数学的,挺有意思的。

  • 2008-07-11 01:21:23

    写书就算了吧,<The Art of Gay>还不知道什么时候起笔呢..
    好,走之前看看,down的到的话:)

发表评论

* 昵称

已经注册过? 请登录

新用户请先注册 以便能显示头像及追踪评论回复

Email
网址
* 评论
表情
 
 

分类小组论坛
杂谈, 娱乐、八卦, 文学、艺术, 体育, 旅游、同城, 象牙塔, 情感, 时尚、生活, 星座, 科技

请注意遵守中华人民共和国法律法规, 如威胁到本站生存, 将依法向有关部门报告, 同时本站的相关记录可能成为对您不利的证据.

相关法律法规
全国人大常委会关于维护互联网安全的决定
中华人民共和国计算机信息系统安全保护条例
中华人民共和国计算机信息网络国际联网管理暂行规定
计算机信息网络国际联网安全保护管理办法
计算机信息系统国际联网保密管理规定