# @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')
...
```
