小草根的博客... » 日志 » Singleton In Python
Singleton In Python
NGloom 发表于 2008-07-10 12:31:31
半年没有往这个目录里加东西了吧,今天来吹吹灰,咳咳..
从网上找到的找到的讲Python的设计模式东东,原址如下:
http://www.python.org/workshops/1997-10/proceedings/savikko.html
===============================================
Python里类没有Private方法,所以要用单例模式的时候不能通过禁用到构造方法来实现对新实例产生的封锁.
C++中的单例:
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~
从网上找到的找到的讲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~
相关日志:
收藏:
QQ书签
del.icio.us
订阅:
Google
抓虾
