class Base:
def __init__(self):
self.x = 4
class C1(Base):
...
class C2(Base):
...
obj1 = C1()
obj2 = C2()
obj1.x = 2
我理解“Singletons”如果改变C1的“self.x”,它可以自动更新该单个类的每个实例的“self.x”......但是如何使用相同的基类更新所有类?
答案 0 :(得分:1)
将x声明移出init:
class Base:
x = 4
def __init__(self):
稍后当您需要进行设置时,请执行以下操作:
Base.x = 5
你可以将它包装成@staticmethod
以使其更容易。
正如其他人所提到的,静态变量真的坏了,你不应该使用它们,除非它是你的最后手段。
答案 1 :(得分:1)
有人纠正我,如果我错了,但这可以通过一个简单的描述符轻松解决,例如:
class KeepSync(object):
def __init__(self, default):
self.value = default
def __get__(self, instance, owner):
return self.value
def __set__(self, instance, value):
self.value = value
class Foo(object):
bar = KeepSync(0)
class C1(Foo):
pass
class C2(Foo):
pass
f = C1()
g = C2()
print "f.bar is %s\ng.bar is %s" % (f.bar, g.bar)
print "Setting f.bar to 10"
f.bar = 10
print "f.bar is %s\ng.bar is %s" % (f.bar, g.bar) # YAY BOTH ARE 10 !
任何继承KeepSync描述符的对象都将返回该值,我不确定我是否帮助过,但这就是我理解问题的方法,你甚至不需要基类但是你可以
答案 2 :(得分:0)
你要做的事情是行不通的。虽然初始x = 4
存储在类而不是实例上,但obj1.x = 2
之类的任何赋值都会将其存储在实例上。
如果你真的想创建一个单例,(ab)使用元类来确保创建的每个实例实际上都是同一个。有关如何操作的示例,请参阅this answer。