Python单例模式优雅的写法

写在前面: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。