4

私のオンライン python コースでは、次の質問がありました。

ワード トリガー抽象クラス、WordTrigger を実装します。クラスのコンストラクターへの引数として文字列の単語を受け取る必要があります。

これは解決策として投稿されました:

class WordTrigger(Trigger):
    def __init__(self, word):
        self.word = word

    def isWordIn(self, text):  
        import string
        for letter in text:
            if letter in string.punctuation:
                text = text.replace(letter, ' ', 1)
        text = text.lower()
        wordlist = text.split(' ')
        if self.word.lower() in wordlist:
            return True
        return False


# TODO: TitleTrigger
class TitleTrigger(WordTrigger):
    def evaluate(self, story):
        return self.isWordIn(story.getTitle())

# TODO: SubjectTrigger
class SubjectTrigger(WordTrigger):
    def evaluate(self, story):
        return self.isWordIn(story.getSubject())

抽象クラスについての私の理解は、抽象クラスは、実装なしで使用されるメソッドを定義する特別なクラスであるため、オブジェクトをインスタンス化してメソッドにアクセスしようとすると、実装エラーは発生しません。

WordTrigger抽象クラスはどうですか?

4

2 に答える 2

9

そうではありません。

残念ながら、あなたのオンラインコースはあなたのチェーンを少し引っ張っています. 彼らが「答え」としてそこに書いたのは、単純な継承です。abc (abstract base class) モジュールがなければ、少なくとも他の言語にあるという意味では、「抽象」Python クラスのようなものは実際には存在しません。あなたが来ることができる最も近いのは、おそらく以下を発生させるメソッドを定義することですNotImplemented:

class BaseClass(object):
    def evaluate(self, story):
        raise NotImplementedError('This is an "abstract" method!')

そうすれば、サブクラスがそのメソッドを使用したい場合は、少なくともそのメソッドをオーバーライドできます。「抽象」メソッドを呼び出す他のメソッドを実装することで、ユーザーにさらに嫌がらせをして、従来の「抽象クラス」に近づけることができます。

# Don't do this!
class BaseClass(object):
    def evaluate(self, story):
        raise NotImplementedError('This is an "abstract" method!')

    def run(self):
        self.evaluate(None) #This will blow up until you implement self.evaluate!
        # ... other code...

これは構文的には問題ありません。場合によっては、一部のコンテキストでやりたいことを実行することもありますが、一般的には、必要なメソッドを記述して後でオーバーライドする方がよいでしょう。BaseClass.evaluateこれは、実際には「抽象的」のままであるという保証がないため、特に当てはまります。後で (クラスが定義された後) 来て書くBaseClass.evaluate = lambda self, story: Noneことができ、それは完全に合法であるだけでなく、遭遇せずrunに のインスタンスを呼び出すこともできます。 。BaseClass_ NotImplementedErrorあなたがそれを助けることができるなら、この種のものから完全に離れたほうがよい.

あなたのオンラインコースはWordTrigger、サブクラスに必要なすべてのメソッドが含まれていないため、クラスを「抽象」と呼んでいますが、実際には意味のあることではありません.サブクラスを持つクラスを「抽象」と呼ぶようなものです.そのサブクラスは新しいメソッドを定義します。

于 2013-04-02T19:39:58.950 に答える