使用继承在 Python 中由另一个提供一个 class

Using inheritance to provide one class by another in Python

我正在努力成为一名自学成才的开发人员,所以当我不了解课程中的任务时,没有人可以问我。问题是关于继承。 给定结构

我必须实现一些 classes 作为监视新闻的程序。 我得到了基础摘要 class 触发器

class Trigger(object):
    def evaluate(self, story):
        """
        Returns True if an alert should be generated
        for the given news item, or False otherwise.
        """
        # DO NOT CHANGE THIS!
        raise NotImplementedError

然后我必须根据该方案实施其他 classes。我是这样做的:

class PhraseTrigger(Trigger):
    
    def __init__(self, trigger, story):
        self._trigger = trigger
        self._story = story
    
    def is_phrase_in(self):

        phrase_to_match = r"((\W)+|^)"
        for i in self._trigger.split():
            phrase_to_match += i
            if (i != self._trigger.split()[-1]):
                phrase_to_match += r"(\W)+"
            else:
                phrase_to_match += r"((\W)+|$)"

        # print(phrase_to_match) # delete after debugging
        scheme_to_match = re.compile(phrase_to_match, re.IGNORECASE)
        mo = scheme_to_match.search(self._story)

        if (mo != None):
            return True
        else:
            return False
        
    def evaluate(self, story):
        """
        Returns True if an alert should be generated
        for the given news item, or False otherwise.
        """
        
        if is_phrase_in(self):
            return True
        else:
            return False

除了 Not-、And- 和 OrTrigger,我都做了。 接下来有人说“NotTrigger 应该通过反转另一个触发器的输出来产生它的输出。NOT 触发器应该将这个另一个触发器作为其构造函数的参数”。如何将另一个 class 添加到 NotTrigger 的 init 方法?或者我没有完全理解这个想法。任何建议将被认真考虑。 P.S。抱歉文字太长,我的英语不好(这是我的第二语言)。

这意味着 NotTrigger.__init__Trigger 实例 作为其参数。一旦你有了它,你就可以根据另一个触发器的 evaluate 方法来实现 NotTrigger.evaluate 。像

class NotTrigger:
    def __init__(self, trigger):
        self.trigger = trigger


    def evaluate(self, story):
        if self.trigger.evaluate(story):
            ...
        else:
            ...

请注意,应该采用 story 参数的不是 __init__,而是 evaluate。如果 Trigger 包装另一个 Trigger(或多个),evaluate 的工作是确保调用包装的 Triggerevaluate 方法在适当的时候 story

让我们从 NotTrigger 的简单实现开始。以下是您如何定义接受另一个触发器的初始化程序(技术上不是构造函数):

class NotTrigger:
    def __init__(self, trigger):
        self.trigger = trigger

现在 evaluate 方法应该很简单了:

def evaluate(self, story):
    return not self.trigger.evaluate(story)

希望您现在看到了实施 PhraseTrigger 时遇到的一些问题:

  1. PhraseTrigger 不应接受另一个触发器作为 __init__ 的参数,也不应接受故事。
  2. PhraseTrigger 不应该直接实现 evaluate:这取决于 child 类.
  3. PhraseTrigger 应该接受要搜索的短语。
  4. PhraseTrigger 应该提供一种方法 is_phrase_in(self, text)text 中搜索 self.phrase。 Child 类 将确定要为 text.
  5. 传递的内容