Как предотвратить изменения родительской переменной класса, которые будут приняты дочерним классом - PullRequest
0 голосов
/ 18 января 2019

Мне было интересно, возможно ли предотвратить изменение переменной класса Parent, которая будет принята классом Child, который наследуется от класса Parent.

Я бы хотел что-то вроде:

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 голосов
/ 18 января 2019

Это происходит потому, что foo является одинаковой переменной в обоих классах.

Это аналог глобальной переменной в модуле и возможность видеть, что две разные функции в этом модуле могут видеть и изменять эту глобальную переменную.

Возможное исправление:

class Parent(object):
    foo = 'bar'

class Child(Parent):
    foo = Parent.foo

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

Выход:

bar
...