Python: доступ к переменной класса из списка аргументов метода класса

Код

class Foo:

    bar = 1

    def run(self, arg1=bar):        # ok
#    def run(self, arg1=Foo.bar):    # fail
#    def run(self, arg1=self.bar):   # fail

#        print(bar)                  # fail
        print(Foo.bar)              # ok
        print(self.bar)             # ok

Foo().run()

Вопрос

Почему для списка аргументов и тела функции требуются разные шаблоны доступа? У них разные правила пространства имен? Где я могу найти подлинную документацию по этому поводу?

В документации: 9.1 и 9.2 в разделе "Классы" учебного пособия.. [Именование и привязка] (в модели выполнения] (docs.python.org/3/reference/executionmodel.html#execu‌tion-model) справочника по языку.

wwii 18.08.2018 05:29

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

DYZ 18.08.2018 05:29

@ juanpa.arrivillaga Где упоминается список аргументов метода класса?

Cyker 18.08.2018 05:44

@DYZ Что вы здесь имеете в виду под тело класса? Вы имеете в виду, что строка с def находится внутри тела класса, но тело метода имеет новую область видимости? Я нигде не вижу, чтобы переменная класса использовалась в качестве аргумента по умолчанию для метода класса в качестве анти-шаблона, не так ли?

Cyker 18.08.2018 05:47

Подобных много, не могу понять, что это дубликат. Эти две ссылки действительно не охватывают ответ: я искал это в документации, но не нашел. При попытке использовать атрибут класса в качестве аргумента по умолчанию для метода этого класса аргументы по умолчанию оцениваются, пока / когда метод компилируется построен /, и поскольку весь класс еще не является законченный, он еще не существует. В основном то, что сказал @DYZ. Вопрос не в области охвата, а в порядке исполнения. По крайней мере, для arg1=Foo.bar и arg1=self.bar

wwii 18.08.2018 05:47

@wwii Странно то, что вам может показаться удивительным, что вы должны использовать другой шаблон доступа для аргумента по умолчанию. Эквивалентное написание приведенного выше кода - проверить arg1 в теле метода и назначить Foo.bar, если он пуст. Однако, если вы пишете это как аргумент по умолчанию, вы отбрасываете квантификатор Foo..

Cyker 18.08.2018 05:53

@Cyker прочитайте этот отвечать, в нем подробно рассказано. Класс здесь - отвлекающий маневр. Операторы определения классов python и операторы определения функций оцениваются в время выполнения, а правила области видимости в основном согласуются с остальной частью python, за исключением того, что тела классов не создают охватывающую область над функциями, определенными внутри них. Но здесь это не актуально. Что такое другой шаблон доступа?

juanpa.arrivillaga 18.08.2018 06:20

Распространенная идиома - использовать аргумент по умолчанию None или какое-либо другое контрольное значение и проверять if arg is None: arg = Foo.bar.

juanpa.arrivillaga 18.08.2018 06:22
Почему в 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 может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
8
69
0

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

Замыкания и область видимости JavaScript: как передать переменную внешней области видимости функции обратного вызова, которая передается в качестве аргумента?
Принадлежит ли имя * open * к встроенной или глобальной области в этом примере?
Как поместить результаты eval () в объект
Как использовать локальную функцию базового метода в замещающем методе
Ограничение области назначения в условном выражении в JavaScript
Поддержка параметров ScriptBlock с лексической областью видимости (например, Where-Object)
Python Cron Job с расписанием не работает
Использование сгенерированной переменной, значение которой было присвоено одной функции в другой функции
Создает ли область потока в ninject новый dbcontext при каждом вызове потока
Причины: «Если привязка больше, чем объем запроса или поддержки bean-компонента, это может вызвать несогласованность». Предупреждение в АПД