如果Python不能拥有私有方法,那么Singleton如何工作

时间:2016-11-04 11:01:34

标签: python

我在这里查看Python中的Singleton设计模式:http://python-3-patterns-idioms-test.readthedocs.io/en/latest/Singleton.html

class OnlyOne:
    class __OnlyOne:
        def __init__(self, arg):
            self.val = arg
        def __str__(self):
            return repr(self) + self.val
    instance = None
    def __init__(self, arg):
        if not OnlyOne.instance:
            OnlyOne.instance = OnlyOne.__OnlyOne(arg)
        else:
            OnlyOne.instance.val = arg
    def __getattr__(self, name):
        return getattr(self.instance, name)

我在想Java中的Singleton模式是使用私有构造函数实现的。

但是,上面的代码中没有私有构造函数,据我所知,Python中没有私有方法。

因此,如果你想实现Singleton,你怎么能阻止某人多次实例化一个类?

2 个答案:

答案 0 :(得分:2)

您发布的代码有instance,这是一个类成员。由于__init__会检查此类成员,因此您可能有多个OnlyOne个实例,但它们都共享相同的__OnlyOne实例。

答案 1 :(得分:0)

OnlyOne会有几个不同的实例。

但是,只有一个内部类__OnlyOne的实例存储为OnlyOne上的类变量。

OnlyOne实例上的所有属性查找实际上都返回__OnlyOne实例的属性值(这是__getattr__方法的作用)。

我从未见过这种模式,通常人们通过创建一个单一实例的模块全局变量来制作单例,然后只是在任何地方使用它。