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

时间:2019-01-18 09:50:10

标签: python python-2.7 inheritance class-variables

我想知道是否有可能防止更改从父类继承的子类采用的父类变量。

我会有类似的东西

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

1 个答案:

答案 0 :(得分:1)

因为foo是两个类中的相同变量,所以会发生此行为。

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

可能的解决方法是:

class Parent(object):
    foo = 'bar'

class Child(Parent):
    foo = Parent.foo

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

输出:

bar