4

私はPythonで(実際にはdjangoアプリで)抽象クラスを実装しようとしていますが、この狂気に直面しています:

>python concreteChildClass.py
Traceback (most recent call last):
    File"concreteChildClass.py, line 1, in <module>
        from abc_base import AbstractBaseClass
ImportError: No module named abc_base

環境でエラーを再現するこれらのファイルに問題を煮詰めました。

abstractBaseClass.py

import abc

class abstractBaseClass(object):
    __metaclass__ = abc.ABCMeta

    @abc.abstractmethod
    def load(self, input):
    """Retrieve data from the input source and return an object."""
        return

コンクリートチャイルドクラス.py

from abc_base import AbstractBaseClass

class ConcreteChildClass(object):
    def load(self, input):
        return input.read()

ここに私のpythonバージョン情報があります

>>> import sys
>>> print sys.version
2.7.3 (default, Jan  2 2013, 13:56:14)
[GCC 4.7.2]

私はPythonにかなり慣れていませんが(この質問は痛々しいほど明白になる可能性があるため)、「abc」がどのように見つかるかわかりませんが、「abc_base」は見つかりません。私の読書とグーグルは、これに関する答えに私を導きませんでした。これがばかげた質問である場合は、事前に感謝し、お詫び申し上げます。

4

1 に答える 1

16

このチュートリアルに従っていると思いますか?

あなたが犯した間違い(そして公平を期すために、チュートリアルはこれについて不明確です)は、それabc_baseが標準ライブラリ内にあるモジュールの名前であると想定していることです。

むしろ、たまたま、PluginBaseクラスが定義されているチュートリアルの最初の python ファイルの名前になっているだけです。


コードが機能するように調整するには、目的の基本クラスを含むファイルからではなく、任意のファイルからインポートする必要がありますabc_base

注:あなたの例ではクラス名とファイル名が同じであるため、先に進んでファイル名を変更して、何が起こっているのか、何をインポートする必要があるのか​​を明確にしました:

base.py

import abc

# Note: You forgot to capitalize the 'A' in the original
class AbstractBaseClass(object):
    __metaclass__ = abc.ABCMeta

    @abc.abstractmethod
    def load(self, input):
    """Retrieve data from the input source and return an object."""
        return

コンクリート.py

from base import AbstractBaseClass

class ConcreteChildClass(AbstractBaseClass):
    def load(self, input):
        return input.read()
于 2013-09-18T15:39:55.013 に答える