web-dev-qa-db-ja.com

python @abstractmethodデコレータ

抽象基本クラスに関するpython docsを読みました:

ここ から:

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>>

ここで何が欠けていますか? ConcreteClassmust抽象メソッドを実装する必要がありますが、例外は発生しません。

35
Sebastian

そのコードを実行するためにpython3を使用していますか?はいの場合、メタクラスをpython 3 変更あり で宣言することを知っておく必要があります。代わりに次のように行う必要があります。

import abc

class AbstractClass(metaclass=abc.ABCMeta):

  @abc.abstractmethod
  def abstractMethod(self):
      return
50
mouad