如何防止父 class 变量更改被子 class 采用

How to prevent Parent class-variable changes to be adopted by Child class

我想知道是否可以防止对父 class 变量的更改被继承自父 class 的子 class 采用。

我想要这样的东西:

class Parent(object):
    foo = 'bar'

class Child(Parent):
    pass

覆盖Parent.foo也会导致Child.foo改变:

>>> Parent.foo = 'rab'
>>> print Parent.foo
rab
>>> print Child.foo
rab

有什么方法可以防止这种情况发生,还是我不应该这样做?

解决方案

阅读@quamrana 的回答后,我意识到可以使用元class:

来避免这种情况
class Meta(type):
    def __new__(cls, new, bases, dct):
        dct['foo'] = 'bar'
        return super(Meta, cls).__new__(cls, new, bases, dct)

class Parent(object):
    __metaclass__ = Meta

class Child(Parent):
    pass
>>> Parent.foo = 'rab'
>>> print Parent.foo
rab
>>> print Child.foo
bar

出现此行为是因为 foo 在 类.

中是同一个变量

这类似于模块中的全局变量,并且能够看到该模块中的两个不同函数都可以看到和更改该全局变量。

一个可能的解决方法是:

class Parent(object):
    foo = 'bar'

class Child(Parent):
    foo = Parent.foo

Parent.foo = 'zoo'
print(Child.foo)

输出:

bar