Есть ли цель создания класса Abstract, подобного следующему - PullRequest
0 голосов
/ 18 апреля 2019

Я часто вижу классы, реализованные таким образом, и просто задаюсь вопросом, почему? Даже если это базовый класс, это не создает интерфейс, которому может следовать дочерний класс.

class AnAbstractBaseCLass:
    pass

Ответы [ 2 ]

0 голосов
/ 20 апреля 2019

Может быть, это что-то аналог интерфейса маркеров Java.Например, RandomAccess является пустым интерфейсом (без методов):

Маркерный интерфейс, используемый реализациями List для указания того, что они поддерживают быстрый (обычно постоянное время) произвольный доступ.Основная цель этого интерфейса - позволить универсальным алгоритмам изменять свое поведение, чтобы обеспечить хорошую производительность при применении к спискам случайного или последовательного доступа.

Независимо от того, поддерживает ли список быстрый произвольный доступ или нет, это не влияетинтерфейс списка, но производительность списка.

В более общем смысле интерфейс или базовый класс, как набор открытых методов (что на самом деле означает «публичный» в Python), является своего рода функционаломконтракт, но ничего не говорит о нефункциональных вопросах (см. В чем разница между функциональными и нефункциональными требованиями? ).В большинстве случаев мы точно знаем тип объекта, который используем, но иногда, из-за полиморфизма, мы не знаем.Тем не менее, нам может потребоваться некоторая нефункциональная информация, и хорошим базовым классом может быть void:

if isinstance(L, RandomAccess):
    # I can use L[i] without performance penalty 
else:
    # I will use an iterator
0 голосов
/ 18 апреля 2019

Может быть полезно иметь базовый класс, подобный тому, который вы показываете, если экземпляры подклассов могут смешиваться с экземплярами других не производных классов, и вы хотите легко отличить их друг от друга.

class Base: pass  # empty base class

class Derived1(Base): pass # normally this would have contents, but it's empty for this example
class Derived2(Base): pass

class OtherClass: pass # not derived from Base

mixed_list = [Derived1(), Derived2(), OtherClass()]

filtered_list = [obj for obj in mixed_list if isinstance(obj, Base)]

Это может быть не так уж и ценно, поскольку не гарантируется, что производные классы имеют какие-либо общие интерфейсы, поэтому filtered_list может оказаться невозможным для эффективного использования (так как вы не можете вызвать какой-либо общий метод на его значения). Но возможно и, возможно, даже вероятно, что - это какой-то общий интерфейс, просто это не то, что обеспечивается базовым классом (с модулем abc).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...