![](/img/trans.png)
[英]What is the type of a parameter that is an abstract class name in Python docstrings?
[英]what is an abstract class in python?
在我的在線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
是一個抽象類?
我擔心你的在線課程會讓你的鏈條有點笨拙。 他們在那里寫的“答案”就是簡單的繼承。 如果沒有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
並且不僅僅是完美的合法,但我也run
在沒有遇到NotImplementedError
情況下調用BaseClass
實例run
。 如果你可以幫助它,最好完全遠離這類事情。
你的在線課程將他們的WordTrigger
類稱為“抽象”,因為它不包含你在子類中可能想要的所有方法,但實際上這並不是一個有意義的事情 - 它就像調用任何具有子類“abstract”的類一樣因為它的子類定義了一個新方法。
看看ABC模塊 。 這允許您使用abastract方法定義抽象類。 作為一種教育練習,您也可以嘗試使用元類來實現自己,但只需重新發明輪子以了解它的工作原理。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.