Python教程:用__new__ 创建单例模式

打印 上一主题 下一主题

主题 867|帖子 867|积分 2611

1.用 __new__方法
  1. class Singleton(object):
  2.     def __new__(cls):
  3.         if not hasattr(cls,'_instance'):
  4.             cls._instance=super(Singleton,cls).__new__(cls)
  5. #            cls.__instance = object.__new__(cls) #这样也可以
  6.         return cls._instance
  7. a = Singleton()
  8. b = Singleton()
  9. c = Singleton()
  10. print(a,id(a))
  11. print(b,id(b))
  12. print(c,id(c))
复制代码
输出:
  1. <__main__.Singleton object at 0x000000000287A240> 42443328
  2. <__main__.Singleton object at 0x000000000287A240> 42443328
  3. <__main__.Singleton object at 0x000000000287A240> 42443328
复制代码
2.共享属性方法

共享属性:创建实例时把所有实例的__dict__指向同一个字典,这样它们具有相同的属性和方法.
  1. class Borg(object):
  2.     _state = {}
  3.     def __new__(cls, *args, **kw):
  4.         ob = super(Borg, cls).__new__(cls, *args, **kw)
  5.         ob.__dict__ = cls._state
  6.         return ob
  7. class MyClass2(Borg):
  8.     a = 1
  9. b1 = MyClass2()
  10. b2 = MyClass2()
  11. b3 = MyClass2()
  12. b1.a='萨菲的'
  13. b2.a='萨菲02'
  14. b1.a='萨菲03'
  15. MyClass2.a = 333
  16. print(id(b1),id(b2),id(b3))
  17. print(b1.a,b3.a,b2.a)
  18. print(id(b1.a),id(b2.a),id(b3.a))
复制代码
输出:
  1. 42902024 42902080 42901688
  2. 萨菲03 萨菲03 萨菲03
  3. 167568080 167568080 167568080
复制代码
装饰器版本
  1. def singleton(cls, *args, **kw):
  2.     instances = {}
  3.     def getinstance():
  4.         if cls not in instances:
  5.             instances[cls] = cls(*args, **kw)
  6.         return instances[cls]
  7.     return getinstance
  8. @singleton
  9. class MyClass:
  10.     a = 1
  11. b1 = MyClass()
  12. b2 = MyClass()
  13. b3 = MyClass()
  14. print(id(b1),id(b2),id(b3))
  15. print(b1.a,b3.a,b2.a)
复制代码
输出:
  1. 42712928 42712928 42712928
  2. 1 1 1
复制代码
类方法版
  1. class Foo():
  2.     __v = None
  3.     @classmethod
  4.     def get_instance(cls):
  5.         if cls.__v:
  6.             print("true: 这是cls.__v",cls.__v)
  7.             return cls.__v
  8.         else:
  9.             print("false: 这是cls.__v", cls.__v)
  10.             cls.__v = Foo()
  11.             print("false_1: 这是cls.__v", cls.__v)
  12.             return cls.__v
  13. obj = Foo.get_instance()
  14. obj1 = Foo.get_instance()
  15. obj2 = Foo.get_instance()
  16. obj3 = Foo.get_instance()
  17. print(obj,'哈哈',id(obj))
  18. print(obj1,'哈哈',id(obj1))
  19. print(obj2,'哈哈',id(obj2))
  20. print(obj3,'哈哈',id(obj3))
复制代码
输出:
  1. false: 这是cls.__v None
  2. false_1: 这是cls.__v <__main__.Foo object at 0x00000000025002E8>
  3. true: 这是cls.__v <__main__.Foo object at 0x00000000025002E8>
  4. true: 这是cls.__v <__main__.Foo object at 0x00000000025002E8>
  5. true: 这是cls.__v <__main__.Foo object at 0x00000000025002E8>
  6. <__main__.Foo object at 0x00000000025002E8> 哈哈 38798056
  7. <__main__.Foo object at 0x00000000025002E8> 哈哈 38798056
  8. <__main__.Foo object at 0x00000000025002E8> 哈哈 38798056
  9. <__main__.Foo object at 0x00000000025002E8> 哈哈 38798056
复制代码
单例默认:
  1. '''
  2. 学习中遇到问题没人解答?小编创建了一个Python学习交流群:711312441
  3. 寻找有志同道合的小伙伴,互帮互助,群里还有不错的视频学习教程和PDF电子书!
  4. '''
  5. class Singleton(object):
  6.     def __new__(cls,*args,**kwargs):
  7.         if not hasattr(cls,'_instance'):
  8.             print('你好啊',)
  9.             cls._instance = super(Singleton,cls).__new__(cls)
  10.             print(cls._instance, '阿斯蒂芬01')
  11.             return cls._instance
  12.         print( '阿斯蒂芬')
  13.         print(cls._instance, '阿斯蒂芬02')
  14.         return cls._instance
  15.         
  16. a = Singleton()
  17. print('这是a',id(a),a)
  18. b = Singleton()
  19. print('这是b',id(b),b)
复制代码
输出:
  1. 你好啊
  2. <__main__.Singleton object at 0x000000000288BEF0> 阿斯蒂芬01
  3. 这是a 42516208 <__main__.Singleton object at 0x000000000288BEF0>
  4. 阿斯蒂芬
  5. <__main__.Singleton object at 0x000000000288BEF0> 阿斯蒂芬02
  6. 这是b 42516208 <__main__.Singleton object at 0x000000000288BEF0>
复制代码
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

来自云龙湖轮廓分明的月亮

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表