9

これは、「python の abc モジュールを使用して抽象クラスを作成する」というこの質問に対する回答を参照したものです。(@alexvasselによって、回答として受け入れられました)。

提案を試してみましたが、不思議なことに、その方法を使用するための提案に従っているにもかかわらず、うまくいきabcません。したがって、ここに質問として投稿しています。

ここに私のPythonコードがあります:

from abc import ABCMeta, abstractmethod

class Abstract(object):
    __metaclass__ = ABCMeta

    @abstractmethod
    def foo(self):
        print("tst")

a = Abstract()
a.foo()

このモジュールを実行すると、コンソールに次のような出力が表示されます。

pydev debugger: starting (pid: 20388)
tst

その受け入れられた答えとは対照的に

>>> TypeError: Can not instantiate abstract class Abstract with abstract methods foo

それで、私は何を正しくまたは間違っていますか?なぜ機能し、失敗しないのですか?これについての専門家の洞察に感謝します。

4

2 に答える 2

5

Python 2 では、次のようにメタクラスを割り当てる必要があります。

import abc

class ABC(object):

    __metaclass__ = abc.ABCMeta

    @abc.abstractmethod
    def foo(self):
        return True

a = ABC()

どちらが発生しますTypeError

Traceback (most recent call last):
  File "<pyshell#59>", line 1, in <module>
    a = ABC()
TypeError: Can't instantiate abstract class ABC with abstract methods foo

しかし、Python 3 では__metaclass__、属性としての割り当ては機能しません (意図したとおりですが、インタープリターはそれをエラーとは見なしません。他の属性と同様に通常の属性であるため、上記のコードはエラーを発生させません)。 . メタクラスは、クラスへの名前付き引数として定義されるようになりました:

import abc

class ABC(metaclass=abc.ABCMeta):

    @abc.abstractmethod
    def foo(self):
        return True

a = ABC()

を上げるTypeError

Traceback (most recent call last):
  File "main.py", line 11, in 
    a = ABC()
TypeError: Can't instantiate abstract class ABC with abstract methods foo
于 2014-06-16T00:11:08.717 に答える