如何防止父 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
我想知道是否可以防止对父 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