当通过obj = object .__ new __(SomeClass)创建python对象时会发生什么

时间:2015-04-06 10:52:46

标签: python singleton

我正在尝试在python中创建一个单例类。 我在Stackoverflow中的一个示例中找到了如下所示

class Singleton(object):
    _instance = None
    def __new__(cls, *args, **kwargs):
        print "New called"
        if cls._instance:
            return cls._instance
        cls._instance = super(Singleton, cls).__new__(
                cls, *args, **kwargs)
        return cls._instance


if __name__ == '__main__':
    s1=Singleton()
    s2=Singleton()
    if id(s1)==id(s2):
        print "Same"
    else:
        print "Different"
    print id(s1)
    print id(s2)

到目前为止它很好,它给了我一个单身,但当我用

制作一个对象时
s3 = object.__new__(Singleton)

它给了我一个全新的对象。 每当我通过 object .__ new __(Singleton)创建一个实例时,它会给我一个新实例。

它没有调用Singleton类的 new 方法来创建一个新对象。 我的问题是如何创建一个单独的单元,它可以同时使用s1 = Singleton()和s3 = object。 new (Singleton)

2 个答案:

答案 0 :(得分:0)

你明确地说object.__new__,你想使用对象的新方法而不是Singleton的新方法。那么为什么有人会使用这种方法来创建Singleton

答案 1 :(得分:0)

object.__new__()YourClass.__new__()

不同

当您致电YourObject时,_instance会添加到您的YourObject,并设置为None(请记住它是静态的)。 但是,当您致电object.__new()时,名为object的{​​{1}}中不存在任何变量,因此当您致电_instance时,会为其分配YourObject。简而言之:当您使用None类的__new__时,您的__instance逻辑未被检查

object