class Base:
def __init__(self):
self.x = 4
class C1(Base):
...
class C2(Base):
...
obj1 = C1()
obj2 = C2()
obj1.x = 2
我理解“单例”如果我更改 C1 的“self.x”,它可以自动更新该单个类的每个实例的“self.x”......但是我将如何使用相同的基础更新所有类?
class Base:
def __init__(self):
self.x = 4
class C1(Base):
...
class C2(Base):
...
obj1 = C1()
obj2 = C2()
obj1.x = 2
我理解“单例”如果我更改 C1 的“self.x”,它可以自动更新该单个类的每个实例的“self.x”......但是我将如何使用相同的基础更新所有类?
将 x 声明移出 init:
class Base:
x = 4
def __init__(self):
稍后当您需要设置它时,请执行以下操作:
Base.x = 5
您也可以将其包装成 a@staticmethod
以使其更容易。
正如其他人所提到的,静态变量非常糟糕,除非这是你最后的手段,否则你不应该使用它们。
如果我错了,有人纠正我,但这可以用一个简单的描述符轻松解决,例如:
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 描述符的对象都将始终返回该值,我不确定我是否有帮助,但这就是我理解问题的方式,你甚至不需要基类,但你可以
你试图做的事情是行不通的。虽然初始x = 4
值存储在类上,而不是实例上,但任何赋值obj1.x = 2
都会将其存储在实例上。
如果你真的想创建一个单例,(ab)使用元类来确保创建的每个实例实际上都是同一个。有关如何执行此操作的示例,请参见此答案。