有一种简单而优雅的方法来定义单身汉吗?

有一种简单而优雅的方法来定义单身汉吗?

似乎有很多方法来定义单子在Python里。对于堆栈溢出是否有一致意见?



森栏
浏览 566回答 3
3回答

呼如林

我并不认为这是必要的,因为具有函数(而不是类)的模块可以很好地服务于单个实例。它的所有变量都将绑定到模块,模块无论如何都不能被反复实例化。如果您确实希望使用类,则无法在Python中创建私有类或私有构造函数,因此您无法防止多个实例化,只能通过使用API的约定进行保护。我仍然会将方法放在一个模块中,并将该模块视为单例。

潇潇雨雨

这是我自己的单身汉的实现。您所要做的就是装饰类;要获得单例,则必须使用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

您可以覆盖__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"
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python