gpt4 book ai didi

python - 什么是python中的抽象类?

转载 作者:太空宇宙 更新时间:2023-11-03 12:49:28 24 4
gpt4 key购买 nike

在我的在线 python 类(class)中,我有这个问题:

Implement a word trigger abstract class, WordTrigger. It should take in a string word as an argument to the class's constructor.

这是作为解决方案发布的:

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 是如何成为抽象类的?

最佳答案

不是。

恐怕您的在线类(class)有点拉扯您的链条。他们在那里写的“答案”是简单的继承。没有 abc (抽象基类)模块,实际上并没有任何像“抽象”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 这不仅完全合法,而且我还可以在 BaseClass 的实例上调用 run 而不会遇到 NotImplementedError。如果可以的话,最好完全远离这种事情。

您的在线类(class)将他们的 WordTrigger 类称为“抽象”类,因为它不包含您可能希望在其子类中使用的所有方法,但实际上这样说并没有什么意义——就像调用任何具有子类“抽象”的类,只是因为它的子类定义了一个新方法。

关于python - 什么是python中的抽象类?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15772504/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com