有一种简单而优雅的方法来定义单身汉吗?似乎有很多方法来定义单子在Python里。对于堆栈溢出是否有一致意见?
3 回答
呼如林
TA贡献1798条经验 获得超3个赞
潇潇雨雨
TA贡献1833条经验 获得超4个赞
Instance
@Singletonclass Foo: def __init__(self): print 'Foo created'f = Foo() # Error, this isn't how you get the instance of a singletonf = Foo.instance() # Good. Being explicit is in line with the Python Zeng = Foo.instance() # Returns already created instanceprint f is g # True
class Singleton: """ A non-thread-safe helper class to ease implementing singletons. This should be used as a decorator -- not a metaclass -- to the class that should be a singleton. The decorated class can define one `__init__` function that takes only the `self` argument. Also, the decorated class cannot be inherited from. Other than that, there are no restrictions that apply to the decorated class. To get the singleton instance, use the `instance` method. Trying to use `__call__` will result in a `TypeError` being raised. """ def __init__(self, decorated): self._decorated = decorated def instance(self): """ Returns the singleton instance. Upon its first call, it creates a new instance of the decorated class and calls its `__init__` method. On all subsequent calls, the already created instance is returned. """ try: return self._instance except AttributeError: self._instance = self._decorated() return self._instance def __call__(self): raise TypeError('Singletons must be accessed through `instance()`.') def __instancecheck__(self, inst): return isinstance(inst, self._decorated)
慕娘9325324
TA贡献1783条经验 获得超4个赞
__new__
class Singleton(object): _instance = None def __new__(cls, *args, **kwargs): if not cls._instance: cls._instance = super(Singleton, cls).__new__( cls, *args, **kwargs) return cls._instanceif __name__ == '__main__': s1 = Singleton() s2 = Singleton() if (id(s1) == id(s2)): print "Same" else: print "Different"
添加回答
举报
0/150
提交
取消