Изучая концепцию абстрактных классов, кажется, что для этого есть разные синтаксисы, и все они кажутся современными 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
и разные синтаксисы, если все делают то же самое?
Кроме того, почему в первом примере был инициализатор? Насколько я знаю, абстрактный класс должен просто служить образцом для подклассов, и вы даже не можете сделать его экземпляр.
Я читал, что они могут иметь неабстрактные методы, но без возможности их создания ... это кажется довольно бессмысленным.