在这以前,先了解super()和__new__()方法app
super()方法:spa
返回一个父类或兄弟类类型的代理对象,让你可以调用一些从继承过来的方法。代理
它有两个典型做用:code
a. 在单继承的类层次结构中,super()可用于引用父类而不显式父类名称,从而使代码更易于维护。对象
b. 在多重继承中,能够保证公共父类仅被执行一次。blog
__new__方法:继承
a.它是一个类级别的静态方法。一般用于控制生成一个新实例的过程。class
b.返回的是一个实例化出来的实例import
下面为四种实现单例模式的方法object
1. 使用__new__方法
class Singleton(object): def __new__(cls, *args, **kwargs): if not hasattr(cls, '_instance'): orig = super(Singleton, cls) cls._instance = orig.__new__(cls, *args, **kwargs) rerurn cls._instance class A(Singleton): pass # 类A即为单例类
2.共享属性
# 建立实例时把全部实例的__dict__指向同一个字典,这样它们都具备相同的属性和方法(类的__dict__存储对象属性) class Singleton(object): _state = {} def __new__(cls, *args, **kwargs): ob = super(Singleton,cls).__new__(cls, *args, **kwargs) ob.__dict__ = cls._state return ob
class B(Singleton): pass
# 类B即为单例类
3.使用装饰器
def singleton(cls): instance = {} def wapper(): if cls not in instance: instance[cls] = cls(*args, **kwargs) return instance[cls] return wapper @singleton class C: pass # 类C即为单例类
4.import方法
# 做为Python模块时是自然的单例模式 #建立一个sington.py文件,内容以下: class Singleton(object): def foo(self): pass mysington = Singleton() # 运用 from sington import mysington mysington.foo()