首页 > 其他 > 详细

用__new__ 创建单例模式

时间:2021-04-11 00:39:10      阅读:41      评论:0      收藏:0      [点我收藏+]

用 __new__方法

#_*_ encoding: utf-8 _*_   @author: ty  hery   2019/9/6

class Singleton(object):
    def __new__(cls):
        if not hasattr(cls,‘_instance‘):
            cls._instance=super(Singleton,cls).__new__(cls)
        return cls._instance
a = Singleton()
b = Singleton()
c = Singleton()
print(a,id(a))
print(b,id(b))
print(c,id(c))
输出:
<__main__.Singleton object at 0x000000000287A240> 42443328
<__main__.Singleton object at 0x000000000287A240> 42443328
<__main__.Singleton object at 0x000000000287A240> 42443328

共享属性方法

# 共享属性:创建实例时把所有实例的__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
b1 = MyClass2()
b2 = MyClass2()
b3 = MyClass2()
b1.a=‘萨菲的‘
b2.a=‘萨菲02‘
b1.a=‘萨菲03‘
MyClass2.a = 333
print(id(b1),id(b2),id(b3))
print(b1.a,b3.a,b2.a)
print(id(b1.a),id(b2.a),id(b3.a))
输出: 
42902024 42902080 42901688
萨菲03 萨菲03 萨菲03
167568080 167568080 167568080

装饰器版本

# 装饰器版本
def singleton(cls, *args, **kw):
    instances = {}
    def getinstance():
        if cls not in instances:
            instances[cls] = cls(*args, **kw)
        return instances[cls]
    return getinstance
@singleton
class MyClass:
    a = 1
b1 = MyClass()
b2 = MyClass()
b3 = MyClass()
print(id(b1),id(b2),id(b3))
print(b1.a,b3.a,b2.a)
输出:
42712928 42712928 42712928
1 1 1

用__new__ 创建单例模式

原文:https://www.cnblogs.com/heris/p/14642511.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!