72

私は抽象基本クラスに関する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 抽象メソッドを実装する必要がありますが、例外はありません。

4

2 に答える 2

90

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

import abc

class AbstractClass(metaclass=abc.ABCMeta):

  @abc.abstractmethod
  def abstractMethod(self):
      return

完全なコードと答えの背後にある説明は次のとおりです。

import abc

class AbstractClass(metaclass=abc.ABCMeta):

    @abc.abstractmethod
    def abstractMethod(self):
        return

class ConcreteClass(AbstractClass):

    def __init__(self):
        self.me = "me"

# Will get a TypeError without the following two lines:
#   def abstractMethod(self):
#       return 0

c = ConcreteClass()
c.abstractMethod()

abstractMethodが定義されていない場合ConcreteClass、上記のコードを実行すると次の例外が発生します。TypeError: Can't instantiate abstract class ConcreteClass with abstract methods abstractMethod

于 2011-08-25T20:02:26.323 に答える
13

ABCからインポートしabcて独自の抽象クラスを子にABCすることで、コードをよりきれいに見せることができます。

from abc import ABC, abstractmethod

class AbstractClass(ABC):

  @abstractmethod
  def abstractMethod(self):
    return

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

# The following would raise a TypeError complaining 
# abstractMethod is not implemented
c = ConcreteClass()  

Python3.6でテスト済み

于 2021-04-27T13:55:25.507 に答える