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

Рейтинг: 1Ответов: 2Опубликовано: 21.04.2023
class A:
    a = 42
    b = list(a for _ in range(1))

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

NameError: name 'a' is not defined

Ответы

▲ 1Принят

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

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 и тут же выполнить эту функцию.

▲ 0

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

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