> 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/classmethod.md).

# @classmethod

> \
> \[!info] Основное применение\
> Для создания нескольких инициализаторов в классе. Т.к. позволяет изменять свойства класса

Если захотим изменить переменную класса (которая находится в классе а не в `__init__`) ...

```python
...
p = Person()
p.name = 'asdfadsfdsgdsfag'
...
1234
```

Ничего не выйдет - как раз из-за *пространства имен* (`LEGB`)

Это можно сделать с помощью `@classmethod`

```python
class Person:
	name = "Dima"

	@classmethod
	def change_name(cls, name):  # cls просто ставится вместо self
		cls.name = name          # чтобы показать, что речь идёт о классе а не о экземпляре

p = Person()
print(p.__dict__)
p.change_name("Ivan")
12345678910
```

Еще пример кода:

```python
...
@classmethod
def from_obj(cls, obj):
	if hasattr(obj, 'name'): # Проверяет наличие метода у объекта
		name = getattr(obj, 'name')
...
```
