1
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”......但是我将如何使用相同的基础更新所有类?

4

3 回答 3

1

将 x 声明移出 init:

class Base:
    x = 4

    def __init__(self):

稍后当您需要设置它时,请执行以下操作:

Base.x = 5

您也可以将其包装成 a@staticmethod以使其更容易。

正如其他人所提到的,静态变量非常糟糕,除非这是你最后的手段,否则你不应该使用它们。

于 2013-10-30T14:06:22.163 回答
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 描述符的对象都将始终返回该值,我不确定我是否有帮助,但这就是我理解问题的方式,你甚至不需要基类,但你可以

于 2013-10-30T14:09:13.800 回答
0

你试图做的事情是行不通的。虽然初始x = 4值存储在类上,而不是实例上,但任何赋值obj1.x = 2都会将其存储在实例上。

如果你真的想创建一个单例,(ab)使用元类来确保创建的每个实例实际上都是同一个。有关如何执行此操作的示例,请参见此答案。

于 2013-10-30T14:01:28.757 回答