【问题标题】:How to prevent Parent class-variable changes to be adopted by Child class如何防止子类采用父类变量更改
【发布时间】:2019-06-12 13:32:24
【问题描述】:

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

我会有类似的东西:

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

【问题讨论】:

    标签: python python-2.7 inheritance class-variables


    【解决方案1】:

    出现这种行为是因为foo 在两个类中是同一个变量。

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

    一个可能的解决方法是:

    class Parent(object):
        foo = 'bar'
    
    class Child(Parent):
        foo = Parent.foo
    
    Parent.foo = 'zoo'
    print(Child.foo)
    

    输出:

    bar
    

    【讨论】:

    • 感谢您的回答!阅读您的答案,我意识到使用元类也可以解决此类问题。这样可以避免在继承自 Parent 的每个类中添加 foo=Parent.foo
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-03
    • 1970-01-01
    • 2021-07-24
    • 2016-03-27
    • 2012-09-03
    • 1970-01-01
    相关资源
    最近更新 更多