Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/336.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
python单例类装饰器_Python_Singleton_Decorator - Fatal编程技术网

python单例类装饰器

python单例类装饰器,python,singleton,decorator,Python,Singleton,Decorator,我在这里遇到了这个单例实现:在第一个回复中 def singleton(cls): return cls() @singleton class Foo(object): def bar(self): pass if __name__ == '__main__': print id(Foo) print id(Foo) 但我不了解内部工作原理,装饰器返回一个类实例,但为什么每次都返回同一个实例?您可以将该代码重写为 class Foo(ob

我在这里遇到了这个单例实现:在第一个回复中

def singleton(cls):
    return cls()

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

if __name__ == '__main__':

    print id(Foo)
    print id(Foo) 

但我不了解内部工作原理,装饰器返回一个类实例,但为什么每次都返回同一个实例?

您可以将该代码重写为

class Foo(object):
    pass

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

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

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

看看这个:

装饰器本质上是一个

  • 定义一个函数
  • 调用您传入的函数
  • 返回稍后要调用的新“包装”函数
  • 周围的类(这里是decorator)可以这样做:

    class Singleton(object):
         def __init__(self):
            self.instance = None
    
         def __call__(self, function):
             @functools.wraps(function)
             def wrapper(*args, **kw):
                 if self.instance is None:
                    self.instance = function(*args, **kw)
                 return self.instance
             return wrapper
    

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

    singleton
    模式是一种设计模式,它将类的实例化限制为一个对象。当需要一个对象来协调整个系统中的操作时,这非常有用。。。示例是日志记录,因为您希望在应用程序中登录同一个文件。我知道什么是单例模式,但我不理解为什么这个特定的实现像单例模式一样工作。注意,这实际上不是单例模式,因为用户没有实例化该类。这只是用类的实例替换类,然后用户使用该名称作为实例。在python中为单例创建类是完全无用的。这可能是java或其他C++输入的最可怕的反模式。只需在模块级别创建一个Foo()实例并将其称为“singleton”:singleton=Foo()。。。就这样!
    class Singleton(object):
         def __init__(self):
            self.instance = None
    
         def __call__(self, function):
             @functools.wraps(function)
             def wrapper(*args, **kw):
                 if self.instance is None:
                    self.instance = function(*args, **kw)
                 return self.instance
             return wrapper