> For the complete documentation index, see [llms.txt](https://igor-19.gitbook.io/qa/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://igor-19.gitbook.io/qa/avtomatizaciya-testirovaniya/python/oop-v-python-vo-vsekh-podrobnostyakh/peremennye-svoistva-atributy-klassa.md).

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

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

*Local* -> *Enclosing* -> *Global* -> *Builtins*

```python
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*

```python
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* может применяться только в функциях, имеющих вложенную область видимости.

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