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
创建同一类的新对象,而你正在搞乱命名模式。单例通过保持内部状态来做到这一点。这里的状态可能是该类的一个实例。装饰师可以是任意的
看看这个:
装饰器本质上是一个
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