为什么打印的是5 5 5 5而不是5 6 7?(多个单例调用)

2024-10-04 05:34:14 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在尝试创建一个asingleton类,每次调用该类时,该类都会向“a”添加1:

class Singleton(object):
    _instance = None
    a=0
    def __new__(self):
        if not self._instance:
            self._instance = super(Singleton,self).__new__(self)
        self.a+=1
        return self._instance

x=Singleton()
x.a=5
print (x.a)
y=Singleton()
print (y.a)
z=Singleton()
print (z.a)

Tags: instanceselfnonenewreturnifobjectdef
2条回答
class Singleton(object):
    _instance = None
    a=0
    def __new__(self):
        if not self._instance:
            self._instance = super(Singleton,self).__new__(self)
        self._instance.a+=1
        return self._instance

您的线路:

x.a=5

新的属性指定给实例,屏蔽class属性。如果没有这个赋值,实例就没有属性a,而是找到类属性Singleton.a。你知道吗

同时,您的__new__函数继续更改Singleton.a类属性,但是当您访问a实例属性时,不再参考它。你知道吗

如果改为更改class属性,代码将正常工作:

Singleton.a = 5

或者您给了Singleton类一个属性,该属性将对a的访问委托给class属性:

class Singleton(object):
    _instance = None
    a = 0
    def __new__(self):
        if not self._instance:
            self._instance = super(Singleton,self).__new__(self)
        self.a += 1
        return self._instance
    @property
    def a(self):
        return Singleton.a
    @a.setter
    def a(self, value):
        Singleton.a = value

或者在实例而不是类上设置属性:

class Singleton(object):
    _instance = None
    a = 0
    def __new__(self):
        if not self._instance:
            self._instance = super(Singleton,self).__new__(self)
        self._instance.a += 1
        return self._instance

反正是单身。你知道吗

相关问题 更多 >