python单例类d

2024-09-29 17:17:22 发布

您现在位置:Python中文网/ 问答频道 /正文

我在这里遇到了这个单例实现:http://blog.amir.rachum.com/post/21850841339/implementing-the-singleton-pattern-in-python在第一个回复中。在

def singleton(cls):
    return cls()

@singleton
class Foo(object):
    def bar(self):
        pass

if __name__ == '__main__':

    print id(Foo)
    print id(Foo) 

但是我不明白内部的工作原理,decorator返回一个类实例,但是为什么每次都是相同的实例呢?在


Tags: 实例comidhttpfoodefblogpost
2条回答

单粒子通过保持内部状态来实现这一点。这里的状态可能是类的一个实例。装饰师可以是任意的。在

看看这个:

http://hairysun.com/downloads/DecoratorHandout.pdf

class Decorator(object):
    # in __init__ set up state
    def __call__(self, function):
        @functools.wraps(function)
        def wrapper(*args, **kw): # 1.
            print "before func"
            result = function(*args, **kw) # 2.
            print "after func"
            return result
        return wrapper # 3.

>>> decorator2 = Decorator()
>>> @decorator2
... def nothing(): pass

decorator本质上是一个函数

  1. 定义函数
  2. 调用您传入的函数
  3. 返回稍后要调用的新“wrapped”函数

周围的类(这里是decorator)可以这样做:

^{pr2}$

我没有运行代码,但我假设这是一般的工作方式。如果没有可用实例,请创建一个实例。如果有一个可用的,不要创建一个新的,而是返回一个旧的。在生产中使用此属性之前,可能需要检查可调用的其他属性。在

你可以把代码重写成

class Foo(object):
    pass

Foo = singleton(Foo)
# which is
Foo = Foo()

所以在这里,类的名称被它的实例化所代替。在我看来,这有点俗气,特别是因为您仍然可以通过使用Foo.__class__来创建同一类的新对象,而且您在搞乱命名模式。在

相关问题 更多 >

    热门问题