Python @abstractmethod decorator

Я прочитал документы python об абстрактных базовых классах:

От здесь:

abc.abstractmethod(function)Декоратор, показывающий абстрактные методы.

Использование этого декоратора требует, чтобы метакласс класса был ABCMeta или вытекает из него. Класс, имеющий метакласс, полученный из ABCMetaне могут быть созданы, если все его абстрактные методы и свойства переопределены.

И здесь

Вы можете применить декоратор @abstractmethod к таким методам, как draw() которые должны быть реализованы; Затем Python создает исключение для классы, которые не определяют метод. Обратите внимание, что исключение когда вы на самом деле пытаетесь создать экземпляр подкласса Отсутствует метод.

Я использовал этот код, чтобы проверить это:

import abc

class AbstractClass(object):
  __metaclass__ = abc.ABCMeta

  @abc.abstractmethod
  def abstractMethod(self):
    return

class ConcreteClass(AbstractClass):
  def __init__(self):
    self.me = "me"

c = ConcreteClass()
c.abstractMethod()

Код идет хорошо, поэтому я его не понимаю. Если я наберу c.abstractMethod, я получаю:

<bound method ConcreteClass.abstractMethod of <__main__.ConcreteClass object at 0x7f694da1c3d0>>

Что мне здесь не хватает? ConcreteClass должен реализовывать абстрактные методы, но я не получаю исключения.

Ответы

Ответ 1

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

import abc

class AbstractClass(metaclass=abc.ABCMeta):

  @abc.abstractmethod
  def abstractMethod(self):
      return