Как использовать переменные класса для инициализации других переменных класса?

class A:
    a = 42
    b = list(a for _ in range(1))

Почему этот код не работает?

NameError: name 'a' is not defined


Ответы (2 шт):

Автор решения: Aleksandr Fetisov

Можно использовать отложенное вычисление (lazy evaluation) с помощью лямбда-функции, которая будет возвращать значение a при вызове

class A:
    a = 42
    b = [lambda: A.a for _ in range(1)]
→ Ссылка
Автор решения: CrazyElf

Объяснение там довольно сложное, но можно сделать через лямбду (не совсем так, как в другом ответе):

class A:
    a = 42
    b = (lambda a=a:[a for _ in range(1)])()
    print(a, b)

Вывод:

42 [42]

Если коротко, то у списковых, генераторных и прочих сокращений своя область видимости, там уже не работает умолчание, что a - это на самом деле A.a. При этом на A.a там тоже нельзя сослаться, поскольку класс A ещё в процессе определения. Но можно "пробросить" переменную через анонимную функцию lambda и тут же выполнить эту функцию.

→ Ссылка