В Python class
является исполняемым оператором. Когда интерпретатор находит оператор class
, сначала выполняется весь код в блоке оператора class
(в специальном пространстве имен), тогда все имена, определенные в этом блоке, используются для сборки объекта class
(классы Python являются объектами), и, наконец, имя класса привязано к объекту класса в текущей области.
IOW, в блоке оператора класса, объект class
еще не существует и, как следствие, это нельзя ссылаться ни в явном виде (по имени класса), ни в неявно (Python слишком сильно опровергает явное по неявным).
OTHO, объект родительского класса существует в этой точке, очевидно (иначе вы не могли бы наследовать от он), поэтому вы можете явно ссылаться на него:
class Parent(object):
attr = something()
class Child(Parent):
attr = Parent.attr
# do something with Parent.attr
Обратите внимание, что атрибуты, определенные в блоке операторов класса (здесь attr
), являются «атрибутами класса», атрибутами IOW объекта class
и как таковые разделяются между примерами. Когда этот атрибут является изменяемым объектом, мутация его из одного экземпляра будет влиять на все экземпляры.
Также помните, что Python никогда не копирует ничего, поэтому код ниже:
class Parent(object):
attr = {"foo": "bar"}
class Child(Parent):
attr = Parent.attr
attr["baaz"] = "quux"
# or attr.update(baaz="quux") etc
WILL обновить Parent.attr
.