В чем разница между ABC и ABCMeta?

Хотелось бы прояснить отличия между ABC и ABCMeta из модуля abc.
Не совсем понимаю разницу в практическом применении. В документации сказано, что ABC - это

Вспомогательный класс, который использует ABCMeta в качестве своего метакласса.

При этом:

Следует отметить, что тип ABC все еще является ABCMeta, поэтому наследование от ABC требует обычных мер предосторожности в отн.....и т.д.

Я, честно говоря, так и не понял их отличия, кроме того, что класс, созданный через ABCMeta пропадает из MRO:

class Parent(ABC):
    @abstractmethod
    def f(self):
        pass 


class Child(Parent): 
    def f(self):
        pass


print(Child.mro()) # [<class '__main__.Child'>, <class '__main__.Parent'>, <class 'abc.ABC'>, <class 'object'>]

class Parent(metaclass=ABCMeta):
    @abstractmethod
    def f(self):
        pass 


class Child(Parent): 
    def f(self):
        pass


print(Child.mro())  # [<class '__main__.Child'>, <class '__main__.Parent'>, !нет abc! <class 'object'>]

Подскажите, когда какой использовать и есть ли особая разница?


Ответы (1 шт):

Автор решения: Влад

Вот тут этот вопрос обсуждается.

Вкратце: ABC - это просто надстройка над ABCMeta, которая позволяет абстрактный класс создавать не через указание метакласса, а через наследование.

→ Ссылка