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