В чем разница между 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, которая позволяет абстрактный класс создавать не через указание метакласса, а через наследование.