Доступ к атрибутам из другого вложенного класса

Я хотел бы добиться чего-то похожего на эту конструкцию:

class Outer:
    class A:
        foo = 1

    class B:
        def __init__(self):
            self.bar = A.foo

Outer.B().bar  # ==> 1

Но это не срабатывает

NameError: name 'A' is not defined

Я даже не уверен, что понимаю, почему, как я думал, A входит в сферу охвата.

Не могли бы вы помочь мне прояснить, почему это не работает и как я могу это обойти?

Нет, области действия класса не создают ограничивающие области действия. Вот почему в методе, который вы можете использовать A, вам придется использовать Outer.A, как и в B.__init__. Но почему вы для начала используете вложенные классы? Это не общий шаблон в Python ... что это за преимущество?

juanpa.arrivillaga 17.12.2018 22:26

@ juanpa.arrivillaga Хорошо, я не осознавал, что области действия классов различаются. Я согласен с тем, что это не очень распространенный шаблон, и я использую его здесь только впервые, в основном у меня есть два очень маленьких вспомогательных класса (в основном " контейнеры »для атрибутов класса), и я не думаю, что стоит переносить это в модуль. Кроме того, эти два небольших класса не предназначены для использования в общедоступном интерфейсе.

Cedric H. 18.12.2018 13:17
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
1
2
60
4
Перейти к ответу Данный вопрос помечен как решенный

Ответы 4

Ответ принят как подходящий

Имена ищутся Только в globals, locals и нелокальных ячейках (но здесь нет закрытия).

Напишите Outer.A вместо A или подумайте о том, чтобы сделать Outer модулем.

Действительно, очень просто, я изначально думал, что Outer не будет доступен, так как класс еще не создан.

Cedric H. 18.12.2018 13:19
Outer недоступен для кода, выполняемого в области класса. Он является доступен для кода, выполняемого в области действия функции, поскольку функции выполняются только позже. Также обратите внимание, что __class__ существует, но в основном он полезен для reload или скопированного кода для предотвращения опечаток.
o11c 18.12.2018 20:48

Работает, если вы используете Outer.A.foo.

Точно так же, как вы сделали для Outer.B().bar: сделайте то же самое для self.bar=Outer.A().foo

Внутренние классы в Python не имеют доступа к членам включающего класса. Как вы утверждаете, A не входит в сферу действия B. A и B оба входят в область действия Outer, но они не знают друг друга. Поэтому возможное решение вашей проблемы:

class Outer:
    class A:
        foo = 1

    class B:
        def __init__(self, class_a):
            self.bar = class_a.foo

    def __init__(self):
        self.a = self.A()
        self.b = self.B(self.a)


print(Outer.A.foo) # 1
print(Outer.B.bar) # AttributeError: type object 'B' has no attribute 'bar'

outer = Outer()
print(outer.a.foo)  # 1
print(outer.b.bar)  # 1

Другие вопросы по теме