use*_*529 3 python class abstract
在我的在线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())
Run Code Online (Sandbox Code Playgroud)
我对抽象类的理解是抽象类是一个特殊的类,我们在其中定义要在没有任何实现的情况下使用的方法,因此当我们实例化一个对象并尝试访问该方法时,它不会给你带来任何实现错误.
如何是WordTrigger一个抽象类?
我担心你的在线课程会让你的链条有点笨拙.他们在那里写的"答案"就是简单的继承.如果没有abc(抽象基类)模块,那么实际上就没有"抽象"Python类这样的东西,至少在其他语言没有的意义上.你最接近的可能是定义引发的方法NotImplemented:
class BaseClass(object):
def evaluate(self, story):
raise NotImplementedError('This is an "abstract" method!')
Run Code Online (Sandbox Code Playgroud)
这种方式至少会使子类在需要使用它时覆盖该方法.您可以通过实现调用"抽象"方法的其他方法来进一步骚扰您的用户并更接近传统的"抽象类":
# 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...
Run Code Online (Sandbox Code Playgroud)
这在语法上是可以的,也许它甚至会在某些上下文中执行您希望它执行的操作,但通常,最好只编写所需的方法然后稍后覆盖它们.这一点尤其如此,因为实际上并不能保证它BaseClass.evaluate会保持"抽象":我可以稍后(在定义类之后)来写BaseClass.evaluate = lambda self, story: None并且不仅会完全合法,而且我还可以调用不遇到的run实例BaseClass这个NotImplementedError.如果你可以帮助它,最好完全远离这类事情.
你的在线课程正在调用他们的WordTrigger类"抽象",因为它不包含你在子类中可能想要的所有方法,但实际上这并不是一个有意义的事情 - 它就像调用任何具有"抽象"子类的类只是因为它的子类定义了一个新方法.
| 归档时间: |
|
| 查看次数: |
4481 次 |
| 最近记录: |