Путаница с областью видимости в классах PythonPython

Программы на Python
Ответить
Anonymous
 Путаница с областью видимости в классах Python

Сообщение Anonymous »

В настоящее время я просматриваю руководства по Python на сайте python.org. Я работаю на C++ и в учебнике по классам (https://docs.python.org/3/tutorial/classes.html) вижу, что область видимости аналогична той, что используется в C++. Об области видимости и вложенности говорится следующее:

"В любой момент выполнения существует как минимум три вложенные области видимости, пространства имен которых доступны напрямую:

- самая внутренняя область, поиск в которой выполняется первой, содержит локальные имена

- области видимости любых включающих функций, поиск которых начинается с ближайшей охватывающей области, содержат нелокальные, но также неглобальные имена

— предпоследняя область содержит глобальные имена текущего модуля.

— самая внешняя область (последний поиск) — это пространство имен, содержащее встроенные имена "

Однако я попробовал использовать следующий код с той же страницы:

Код: Выделить всё

class Dog:

tricks = []

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

def add_trick(self, trick):
self.tricks.append(trick)     #this is the troublesome self

>>> d = Dog('Fido')
>>> e = Dog('Buddy')
>>> d.add_trick('roll over')    #without the self this complains
>>> e.add_trick('play dead')
>>> d.tricks
['roll over', 'play dead']
Если я удалю self в self.tricks.append(trick), код не будет компилироваться и выдать ошибку NameError: имя 'tricks' не определено при вызове функции d.add_trick('roll over').

Почему это происходит? Как я понимаю из приведенного выше абзаца, функция add_trick должна искать переменную с именем трюки сначала в своей локальной области видимости, затем, если она не находит ее, в ближайшей охватывающей области видимости, которая является областью действия класса Dog, и там она должна ее найти, без необходимости использования self. Что мне не хватает?

Подробнее здесь: https://stackoverflow.com/questions/582 ... on-classes
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Python»