我想知道是否有可能防止更改从父类继承的子类采用的父类变量。
我会有类似的东西
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
答案 0 :(得分:1)
因为foo
是两个类中的相同变量,所以会发生此行为。
这类似于模块中的全局变量,并且能够看到该模块中的两个不同函数都可以查看和更改该全局变量。
可能的解决方法是:
class Parent(object):
foo = 'bar'
class Child(Parent):
foo = Parent.foo
Parent.foo = 'zoo'
print(Child.foo)
输出:
bar