Вложенные классы кажутся такими непитонными, даже если их рассматривать как фабрики.Но, чтобы ответить на ваш вопрос: просто нет c5.a (экземпляр CB).В init-методе CB вы добавляете к классу CA атрибут a, но не к CB!Класс A уже имеет атрибут a, если он создан!Но объект класса B (и даже класса) этого не делает!
Вы также должны помнить, что __init__
не является конструктором, как в C ++ или Java!«Реальный конструктор» в python будет __new__
.__init__
просто инициализирует экземпляр класса!
class A:
c = 'class-attribute'
def __init__(self):
self.i = 'instance-attribute'
Таким образом, в этом примере c является атрибутом класса, где i является атрибутом экземпляра.
Еще большее любопытство - ваша попытка добавить атрибут в базовый класс вмомент создания экземпляра класса ребенка.Вы не получаете «поздний» атрибут наследования таким образом.Вы просто добавляете в класс A дополнительный атрибут, который удивляет меня даже работой.Я полагаю, вы используете Python 3.x?
Причина такого поведения?Ну, я думаю, это связано с аккуратной особенностью питонов, которая в определениях питонов выполняется (AFAIK).
По той же причине:
def method(lst = []):
почтиплохая идеяпараметр deafult связывается в момент определения, и вы не будете генерировать новый объект списка каждый раз, когда вызываете метод, но повторно используете один и тот же объект списка.