Какой «правильный» синтаксис среди них для абстрактных классов? - PullRequest
0 голосов
/ 22 января 2020

Изучая концепцию абстрактных классов, кажется, что для этого есть разные синтаксисы, и все они кажутся современными python 3 синтаксисами:

Один включает в себя ставку metaclass=ABCMeta в скобках класс.

from abc import ABCMeta, abstractmethod

class Shape(metaclass=ABCMeta):
    def __init__(self, id):
        self._id = id

    @abstractmethod
    def display(self): 
        pass

Еще один просто ABC:

from abc import ABC, abstractmethod

class Animal(ABC):

    @abstractmethod
    def move(self):
        pass

И другие даже требуют от вас более грубых методов:


from abc import ABCMeta, abstractmethod

class Animal:
    __metaclass__ = ABCMeta

    @abstractmethod
    def say_something(self): pass

Кажется, все делают то же самое Я предпочитаю второй, так как он самый простой.

Почему один использует ABCMeta и разные синтаксисы, если все делают то же самое?

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

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

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