簡體   English   中英

什么是python中的抽象類?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM