写在前面:Python中一切皆对象
Python单例模式,官网给的一个例子:
def singleton(cls):
instance = cls()
instance.__call__ = lambda: instance
return instance
# Sample use
@singleton
class Highlander:
x = 100
# Of course you can have any attributes or methods you like.
highlander = Highlander()
another_highlander = Highlander()
assert id(highlander) == id(another_highlander)
上面实现单例模式,最重要的是__call__这个魔术方法,先看一个例子:
class T:
a = []
def __init__(self):
pass
def __call__(self, arg):
return arg
t = T()
print(t('Python'))
结果会输出:Python,
如果一个类中重写了__call__这个魔术方法,那么可以把实例化之后的对象当做一个方法来执行,执行的结果就是__call__的逻辑。
然后再来看最开始的那个单例模式:
类Highlander被装饰后,马上执行了这样的一个逻辑:
Highlander = singleon(Highlander),这样的结果就是实例化Highlander类,生成一个对象,并且绑定了__call__方法,该方法返回该实例,最终结果:
Highlander指向一个对象,这个对象就是自己实例化后的对象(暂且叫做instance),然后继续看代码:
highlander = Highlander(),相当于执行了该instance的__call__方法,该方法返回instance,而且无论以后实例化多少次Highlander,都会返回唯一的对象,就是装饰器起作用的时候产生的instance。