@classmethod и функции-фабрики оба создают экземпляры объектов, но принципиально отличаются в том, как они взаимодействуют с самим классом.
@classmethod получает класс как первый аргумент (cls), что делает его привязанным к классу:
class Animal:
@classmethod
def create(cls, name):
return cls(name) # Использует cls, не Animal напрямую
clsФункция-фабрика — это отдельная функция, определённая вне класса:
def create_animal(name):
return Animal(name) # Жёстко привязано к Animal
Это отличие становится критическим при работе с подклассами:
class Dog(Animal):
pass
Dog.create("Rex") # Возвращает экземпляр Dog ✓
create_animal("Rex") # Возвращает экземпляр Animal ✗
@classmethod, когда логика создания экземпляра относится к классу или должна поддерживать наследование@classmethod получает класс в качестве своего первого аргумента, что позволяет ему автоматически возвращать экземпляры правильного типа при вызове на подклассах.
Новый — ещё не проверен сообществом
Вы