Преимущество использования @classmethod вместо типа (self) в Python? - PullRequest
1 голос
/ 05 февраля 2020

Есть ли преимущество в использовании @classmethodcls) вместо 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. Есть ли что-либо против этой практики или случаев, когда этого следует избегать?

1 Ответ

1 голос
/ 05 февраля 2020

В первом случае вы оцениваете тип объекта, а затем создаете из него объект, который будет медленнее, чем при использовании classmethod, поскольку cls напрямую передается функции, и нет необходимости оценивать тип. Другое отличие состоит в том, что для вызова classmethod вам не нужно инициализировать объект этого класса, вы можете напрямую вызвать его, используя A.cls_method()

...