@classmethod

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

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

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

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

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

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

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

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

Last updated