Почему порядок объявления не является проблемой в этом сценарии python - PullRequest
1 голос
/ 20 июня 2020

Мне просто интересно, как на самом деле объяснить, почему это действительно python.

foo.py

class Foo:
    def __init__(self):
        if type(self).__name__ in MAP.keys():
            print('WOO HOOO')
        self.Bar = True

MAP = {'Foo': Foo}

test

>>> from foo import *
>>> x = Foo()
WOO HOOO

Я бы подумал, что MAP dict при ссылке в конструкторе будет недействительным. Это связано с тем, что конструктор проверяется только во время выполнения?

1 Ответ

3 голосов
/ 20 июня 2020

Вы правы, MAP просматривается только при запуске __init__.

Если это помогает вам понять, давайте удалим всю несущественную информацию:

  1. Неважно, что __init__ - это метод. Вы можете добиться того же поведения с функцией.
  2. Значение MAP не важно; мы просто хотим проверить, существует ли он
  3. Давайте также посмотрим, что происходит, когда MAP не существует, используя try-except-else.
  4. Поместите все в один скрипт
  5. self.Bar и x не используются
def foo():
    try:
        MAP
    except NameError:
        print('No!')
    else:
        print('Yes!')

foo()  # -> No!
MAP = 0
foo()  # -> Yes!
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...