python @abstractmethod decorator - PullRequest
       12

python @abstractmethod decorator

25 голосов
/ 25 августа 2011

Я прочитал документы 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 Ответ

37 голосов
/ 26 августа 2011

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

import abc

class AbstractClass(metaclass=abc.ABCMeta):

  @abc.abstractmethod
  def abstractMethod(self):
      return
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...