Единственный способ получить доступ к переменной экземпляра - это атрибут self
.
Когда вы просто ссылаетесь на var
, это никогда не переменная экземпляра; это всегда локальная, включающая, глобальная или встроенная переменная.
В вашем определении метода:
def lookup(self, var=var):
print(var)
… у вас есть параметр с именем var
. Параметры являются локальными переменными. print(var)
внутри тела выводит эту локальную переменную.
А как насчет этого?
def lookup(self, var=var):
var = var
Опять же, var
- это локальная переменная - параметр. Итак, вы просто присваиваете текущее значение этой локальной переменной той же самой переменной. Что не имеет никакого полезного эффекта, но, конечно, это совершенно законно.
Откуда берется значение параметра? Во время вызова функции, если вы передаете аргумент, этот аргумент привязывается к параметру; в противном случае он заполняется значением по умолчанию.
ОК, откуда берется значение по умолчанию?
Во время определения функции (когда выполняется оператор def
), var
ищется в текущей области видимости, то есть в теле определения class
, и его значение сохраняется как значение по умолчанию в объект функции (он должен быть виден как foo.lookup.__defaults__[0]
).
Итак, значением по умолчанию является "value goes here"
.
Обратите внимание, что не - захват закрытия или другая ссылка на атрибут класса. Когда выполняется оператор class
, он использует то же самое пространство имен class
body для построения атрибутов класса, так что в итоге вы получите foo.var
в качестве другого имени для того же значения, что и в foo.lookup.__defaults__[0]
. Но это совершенно независимые имена для этого значения; Вы можете переназначить foo.var = 3
, и значением по умолчанию для параметра lookup
будет по-прежнему "value goes here"
.
Итак, чтобы ответить на ваши конкретные вопросы:
Будет ли оно храниться в переменной класса, переменной экземпляра или новой переменной с тем же именем?
Ничего из вышеперечисленного. Он сохраняет его в локальной переменной, которая уже существует, потому что это параметр.
Получит ли она переменную класса, переменную экземпляра или переменную метода?
Если под «переменной метода» вы подразумеваете параметр, то он является последним.
Как явно указать эти переменные?
Точно так же, как вы явно ссылаетесь на что-то еще:
var
- локальная переменная global-or-встроенная.
self.var
- это атрибут экземпляра или атрибут класса, если атрибут экземпляра отсутствует.
type(self).var
- это атрибут класса, даже если есть атрибут экземпляра.