Переменная класса, которая является экземпляром самого себя - PullRequest
0 голосов
/ 18 февраля 2020

Возможно ли что-то подобное?

class Foo:
    BAR = Foo("bar")
    def __init__(self, name):
        self.name = name

В настоящее время это дает NameError: name 'Foo' is not defined.

1 Ответ

5 голосов
/ 18 февраля 2020

Нет. annotations применяется только к аннотациям переменных и функций. Пока оператор class не будет полностью выполнен, не существует класса Foo для создания экземпляра. Вы должны дождаться, пока определится Foo, чтобы создать его экземпляр.

class Foo:
    def __init__(self, name):
        self.name = name

Foo.BAR = Foo("bar")

Вы всегда можете инициализировать BAR = None, а затем изменить значение атрибута. после того, как класс определен.

class Foo:
    BAR = None  # To be a Foo instance once Foo is defined
    ...

Foo.BAR = Foo("bar")  # Fulfilling our earlier promise

Это может быть желательно для целей документирования, чтобы прояснить определение, что Foo.BAR будет , хотя и с другим значением. Я не могу вспомнить ситуацию, когда это было бы необходимо , однако.

...