Есть ли преимущество в использовании @classmethod
(и cls
) вместо type(self)
для создания экземпляров классов?
Например, абстрактный класс содержит обычный метод, который в какой-то момент создает экземпляр класса Экземпляр подкласса, экземпляр которого вызывает этот метод. Таким образом, вызов type(self)
(расположенный внутри метода в абстрактном базовом классе) будет вызовом подкласса (так же, как я полагаю, будет, если использовать @classmethod
).
class M(ABC):
...
def simple_method(self):
'Do stuff & return new instance'
return type(self)()
@classmethod
def cls_method(cls):
return cls()
class A(M):
...
a = A()
b = a.simple_method()
c = a.cls_method()
Мне кажется, проще и гибче использовать type(self)
, чем @classmethod
. Есть ли что-либо против этой практики или случаев, когда этого следует избегать?