2014-06-20 26 views
2

我工作的MIT OCW 6.00習題集的一個遺傳構造,和我有以下代碼...在Python

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

# Whole Word Triggers 
# Problems 2-5 

# WordTrigger 

class WordTrigger(Trigger): 
    def __init__(self, word): 
     self.word = word 

    def is_word_in(self, text): 
     word = self.word.lower() 
     text = text.lower() 

     #Remove punc and split text 
     for ch in string.punctuation: 
      text = text.replace(ch, ' ') 
     splitText = text.split(' ') 

     #Check if word is in text 
     return word in splitText 


# TitleTrigger 

class TitleTrigger(WordTrigger): 
## def __init__(self, word): 
##  self.word = word 

    def evaluate(self, story): 
     return self.is_word_in(story.get_title()) 

本來我在TitleTrigger()註釋掉的構造函數,但當我運行提供的測試腳本時,它在測試實用程序試圖呼叫我的TitleTrigger()類時拋出一個錯誤。我無法弄清楚什麼是錯誤的,所以我對解決方案代碼達到了頂點,並且他們已經將構造函數註釋掉了,所以這就是我所做的,並且它工作正常。這留下了三個問題...

  1. 我是否正確認爲子類會自動繼承其超類的構造函數,如果它沒有在子類中定義?看來這就是我發表評論時發生的事情。
  2. 我在TitleTrigger()中使用的構造函數與其超類WordTrigger()中的構造函數完全相同,所以爲什麼我將它定義在子類中還是允許子類繼承它?
  3. 我還有另外兩個WordTrigger()的小類,它們與TitleTrigger()相同,除了一個在一個故事的主題中查找一個單詞,而另一個單獨查找摘要。這兩個人通過自己的構造函數就可以很好的完成測試,這看起來很奇怪。

如果需要的話,但如果問題僅僅是在代碼是如何測試我的課怪癖我並不真的需要知道的怪癖就是我可以包括測試代碼。我真的很想知道未來的情況是,子類是否會自動繼承它們的超類構造函數,如果它們(子類)沒有定義它們自己的類,就好像它們如何從超類中繼承其他方法。

+1

爲什麼選擇Python 2.5?:) –

+4

是的,所有類都繼承其超類的所有方法,包括'__init__'。至於你爲什麼得到你的錯誤,很難說這一點,因爲你沒有顯示錯誤是什麼。 – BrenBarn

+0

「當我運行提供的測試腳本時,它會拋出一個錯誤」 - 可能測試實用程序是專門查找是否覆蓋了__init__。 – tdelaney

回答

1

上午我在想,如果它不是在 子類定義的子類會自動繼承 其超類的構造函數是否正確?

是的。在Java中防止這種情況發生的問題是超載(即每個人都從Object繼承,所以每個人最終都會得到一個無用的構造函數)。在Python中不是問題,所以我們得到繼承構造函數。

我TitleTrigger()所使用的構造是在其超一流WordTrigger()的 構造完全相同的副本,那麼,爲什麼這件事 我是否定義它的子類,或者允許的子類 繼承它?

它不應該(除了爲了減少代碼重複),除非我失去了一些東西。

這兩個通過測試很好,他們自己的構造函數,其中 似乎真的離奇。

是的。如果沒有看到更多的代碼/錯誤,我無法猜測出什麼問題。另外,在這裏使用類看起來有點矯枉過正 - 一個函數可以做得很好。不是Java,所以我們不需要將所有東西都包裝在無用的OO層中。

+0

'私人X(){}' - 「無用的構造函數」,我們有一個子類訪問?無論如何,Java中更多的構造函數不是*虛擬的,並且不是*被繼承,重載或不被重載。 Java類中的每個構造函數*必須*(顯式或隱式地)調用基類型的超級構造函數。 – user2864740

+0

謝謝,這有幫助! 至於使用類,它是問題集的一部分,只是一種開始使用類並學習它們如何操作的方法。 – johnbltz