Переменные (свойства / атрибуты) класса

Область видимости:

Local -> Enclosing -> Global -> Builtins

name = "Ivan"


class Person:
	name = "Dima"

	def print_name(self):
		print(name)

p = Person()
p.print_name()

# Ivan
12345678910111213

Переменная name в вызываемом методе print_name будет искаться в начале локально (Local), потом во вложенных функциях (Enclosing) (их нет в print_name) потом глобально (Global) - и тут, как раз находит name = "Ivan"

[!warning] Использование nonlocal Это поведение можно избежать, если обозначить переменную, как nonlocal

name = "Ivan"


class Person:
	def primer(self):
		name = "Dima"

		def print_name(self):
			nonlocal name # обозначим, что переменная не в локальной области видимости
			print(name)

p = Person()
p.print_name()

# Dima
123456789101112131415

[!warning] Применяется только во вложенных функциях nonlocal может применяться только в функциях, имеющих вложенную область видимости.

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

Last updated