为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

森栏 2019-06-18 15:52:57
有一种简单而优雅的方法来定义单身汉吗?似乎有很多方法来定义单子在Python里。对于堆栈溢出是否有一致意见?
查看完整描述

3 回答

?
呼如林

TA贡献1798条经验 获得超3个赞

我并不认为这是必要的,因为具有函数(而不是类)的模块可以很好地服务于单个实例。它的所有变量都将绑定到模块,模块无论如何都不能被反复实例化。

如果您确实希望使用类,则无法在Python中创建私有类或私有构造函数,因此您无法防止多个实例化,只能通过使用API的约定进行保护。我仍然会将方法放在一个模块中,并将该模块视为单例。


查看完整回答
反对 回复 2019-06-18
?
潇潇雨雨

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)


查看完整回答
反对 回复 2019-06-18
?
慕娘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"


查看完整回答
反对 回复 2019-06-18
  • 3 回答
  • 0 关注
  • 565 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信