小米手机网站架构,海外网站推广的公司,wordpress界面菜单怎么弄,佛山网站建设佛山网络推广DAY 13. 单例设计
13.1 什么是单例设计
一个类每次实例化返回的都是同一个对象#xff0c;这种设计模式叫做单例设计#xff0c;这个类叫做单例类
13.2 实现单例设计的方法
13.2.1 重写__new__()
class Foo:def __new__(cls,*args, **kwargs):# 如果是第一次实例化…DAY 13. 单例设计
13.1 什么是单例设计
一个类每次实例化返回的都是同一个对象这种设计模式叫做单例设计这个类叫做单例类
13.2 实现单例设计的方法
13.2.1 重写__new__()
class Foo:def __new__(cls,*args, **kwargs):# 如果是第一次实例化返回一个新对象if not hasattr(cls, _object):cls._object super().__new__(cls)return cls._objectdef __init__(self, name):self.name namedef Print(self):print(fThe name of this object is: {self.name})if __name__ __main__:foo1 Foo(foo1)foo2 Foo(foo2)foo3 Foo(foo3)foo1.Print() # The name of this object is: foo3foo2.Print() # The name of this object is: foo3foo3.Print() # The name of this object is: foo3
13.2.2 使用装饰器
def singleton(cls):singleton_dict {}def close(*args, **kwargs):# 利用字典的setdefault()方法如果第一次实例化就加入字典以后每次都返回这个对象return singleton_dict.setdefault(obj,cls(*args, **kwargs))return closesingleton
class MyClass:passif __name__ __main__:foo1 MyClass()foo2 MyClass()print(foo1) # __main__.MyClass object at 0x000001DF618C8940print(foo2) # __main__.MyClass object at 0x000001DF618C894013.2.3 使用模块
用import导入的模块就是天然的单例模式如果想要实现一个单例类不妨把它作为一个独立的模块,使用时导入由他实例化出来的对象
# mysingleton.py
class My_Singleton(object):def foo(self):passmy_singleton My_Singleton()# to use
from mysingleton import my_singletonmy_singleton.foo()13.2.4 共享属性
共享属性是指所有由“单例类”实例化出来的对象都共享“同一份属性”也就是所有对象的__dict__都指向同一个字典但这样严格来说并不算真的单例模式因为这样还是有多个实例对象但其行为确实和单例模式一样
class Foo:_mydict {}def __new__(cls, *args, **kwargs):ob super().__new__(cls)ob.__dict__ cls._mydictreturn obif __name__ __main__:foo1 Foo()foo2 Foo()foo1.name foo1print(foo2.name) # foo1# foo1 和 foo2 并不是同一个对象只不过他们的方法和属性公用同一块内存print(foo1) # __main__.Foo object at 0x0000023ADA4A8A90print(foo2) # __main__.Foo object at 0x0000023ADA4A8AC813.3 总结
什么是单例模式 单例即单个实例一个类在实例化的过程中始终返回同一个实例 实现单例模式的四种方法 重写__new__(cls)方法该方法是一个类方法用来为实例开辟内存空间返回值是实例化对象通过重写该方法可以使每次实例化都返回同一个对象修饰器方法与之前修饰器那一节的斐波那契数列类似判断字典中有没有对象有的话就直接返回没有才实例化模块这是最简单的方法直接导入实例化对象共享属性通过把所有对象的__dict__指向同一块内存空间来实现虽然不是“一个实例”但其行为与“一个实例”一样