Python实现单例模式方法源码示例分享,python源码,如何用python方法来
Python实现单例模式方法源码示例分享,python源码,如何用python方法来
如何用python方法来实现单例模式?下面我整理了四种可行的方法,分享给同样在学习python的朋友们,供参考。
Python实现单例模式方法源码示例一:实现__new__方法
并在将一个类的实例绑定到类变量_instance上;
如果cls._instance为None,则说明该类还没有实例化过。同时实例化该类并返回;
如果cls._instance不为None,则直接返回cls._instance即可。
class Singleton(object): def __new__(cls, *args, **kw): if not hasattr(cls, '_instance'): orig = super(Singleton, cls) cls._instance = orig.__new__(cls, *args, **kw) return cls._instance class MyClass(Singleton): a = 1 one = MyClass() two = MyClass() two.a = 3 print one.a #3 #one和two完全相同,可以用id(), ==, is方法检测 print id(one) #29097904 print id(two) #29097904 print one == two #True print one is two #True
Python实现单例模式方法源码示例二:共享属性———所谓单例就是所有引用实例、对象拥有相同的属性和方法
同一个类的所有实例天然拥有相同的行为(方法);
只需要保证同一个类的所有实例,具有相同的属性即可;
所有实例共享属性的最简单最直接的方法是:__dict__属性引用同一个dict()
class Borg(object): _state = {} def __new__(cls, *args, **kw): ob = super(Borg, cls).__new__(cls, *args, **kw) ob.__dict__ = cls._state return ob class MyClass2(Borg): a = 1 one = MyClass2() two = MyClass2() #one和two是两个不同的对象,id, ==, is对比结果可看出 two.a = 3 print one.a #3 print id(one) #28873680 print id(two) #28873712 print one == two #False print one is two #False #但是one和two具有相同的(同一个__dict__属性),见: print id(one.__dict__) #30104000 print id(two.__dict__) #30104000
Python实现单例模式方法源码示例三:其实这是方法1的改进升级版
使用__metaclass__(元类)的高级python用法
class Singleton2(type): def __init__(cls, name, bases, dict): super(Singleton2, cls).__init__(name, bases, dict) cls._instance = None def __call__(cls, *args, **kw): if cls._instance is None: cls._instance = super(Singleton2, cls).__call__(*args, **kw) return cls._instance class MyClass3(object): __metaclass__ = Singleton2 one = MyClass3() two = MyClass3() two.a = 3 print one.a #3 print id(one) #31495472 print id(two) #31495472 print one == two #True print one is two #True
Python实现单例模式方法源码示例四:也同样可以理解为方法一的高级版本
使用装饰器(decorator0);
这是一种更pythonic,更elegant的方法;
单例类本身根本不知道自己是单例的,因为他本身(自己的代码)并不是单例的
def singleton(cls, *args, **kw): instances = {} def _singleton(): if cls not in instances: instances[cls] = cls(*args, **kw) return instances[cls] return _singleton @singleton class MyClass4(object): a = 1 def __init__(self, x=0): self.x = x one = MyClass4() two = MyClass4() two.a = 3 print one.a #3 print id(one) #29660784 print id(two) #29660784 print one == two #True print one is two #True one.x = 1 print one.x #1 print two.x #1
编橙之家文章,
相关内容
- python多线程ping及arpping扫描工具的实现,pythonarpping,这是
- python调用win7命令清理系统无用进程方法,pythonwin7,求大
- python中apt简单使用工具,pythonapt工具,python中apt简单
- django实现简单的数据库内容显示,django实现数据库,dj
- 动态filter查询数据Django实现方法,filterdjango,这是我在学
- Python jpg图片裁剪处理源码,,这个Python jpg
- Python实用又常用函数工具方法分享,python函数,这是我自
- Python shelve方法完成信息录入小工具源码,pythonshelve,此
- Python cookbook守护进程代码示例,pythoncookbook,关于python守
- python自动完成扫描端口使用情况示例,python自动完成
评论关闭