每次B类更改时,Python元编程更新类A.

时间:2013-10-30 13:56:42

标签: python metaprogramming

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

3 个答案:

答案 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