Как разрешить NameError при импорте класса с переменными класса, которые зависят друг от друга

Я создаю класс в файле. объявить некоторую переменную класса A = 5 и другую переменную класса B = A+1. При импорте этого класса из другого файла я получаю ошибку NameError: имя «A» не определено. Есть ли способ обойти это или переменные класса могут/должны не зависеть от других переменных класса, как я пытаюсь это сделать?

Обратите внимание, что эта ошибка NameError происходит только при импорте из другого файла. Если бы я определил класс и создал экземпляр этого класса в том же файле, все прошло бы гладко.

файл: file1.py

class foo:
    A = 5
    B = A+7

файл: file2.py

from file1 import foo

Затем я запускаю:

python file2.py

и получить

NameError: name 'A' is not defined.

РЕДАКТИРОВАТЬ : Приведенный выше пример был слишком упрощенным, чтобы отразить мою настоящую проблему. На самом деле я пытался определить класс как таковой:

class foo:
    A = 5
    B = [i*A for A in range(3)]

Причины, по которым это не работает в Python 3, можно найти по ссылке в моем ответе.

@Dschoni Это не сработает, потому что это переменная класса.

gmds 09.04.2019 14:07
Почему в 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
1
45
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Используйте полное имя переменной класса:

В this_module.py:

class C:
    a = 0
    b = C.a + 1

... в другом файле:

from this_module import C

@Mazata Разве вы не должны принять свой собственный ответ в этом случае и отредактировать свой вопрос, чтобы отразить то, что вы на самом деле имели в виду?

gmds 09.04.2019 15:21

Если подумать, да, вы правы. Я сделаю это, как только Stack Overflow позволит мне.

Mazata 09.04.2019 15:27
Ответ принят как подходящий

Я нашел проблему. Мой фрагмент кода был слишком упрощен, чтобы точно отражать мою реальную ситуацию. Я на самом деле делал что-то вроде этого:

class C:
    foo = 2
    bar = [i*foo for i in range(3)]

а затем импортировать этот класс из другого файла. Хотя это, по-видимому, работает в Python 2, согласно этот ответ, в Python 3:

class scope and list comprehension do not mix.

Итак, у вас есть это. На самом деле это может быть помечено как дубликат.

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