使用lambda实现单例模式

Using lambda to implement Singleton pattern

我试图弄清楚为什么这段代码有效,只生成了 class A 的唯一实例。

def singleton_function (c):
    print("singleton_function")
    x = c()
    return lambda : x

@singleton_function
class A:
    pass

def test2 () :
    x = A()
    y = A()
    assert x == y

test2()

输出:

python3 test.py
singleton_function

为什么 singleton_function 只能访问一次? A是function类型的,所以我猜测是调用A,A()的时候,returnsx,是classA的实例,所以,应该打印了两次"singleton_function",因为我正在访问两次。 我哪里想错了?

考虑装饰器语法:

def singleton_function (c):
    print("singleton_function")
    x = c()
    return lambda : x


@singleton_function
class A:
    pass

这实际上是在说:

A = singleton_function(A)

并且 singleton_function() 创建一个 A 的实例,然后 returns 一个指向该实例的函数。

所以我们得到

A = lambda: x

其中 x 是原始 class A. 调用 A() returns x 仍然是 singleton_function() 首先创建的同一个实例.