2014-08-27 70 views
2

我正在學習Python並試圖進入課堂。我試圖抓取一些經常有不同字符串的網站來識別我需要的信息。我面臨的挑戰是,我陷入了可能要尋找幾十個可能字符串中的一個字符串的情況。在那一點上,我是否繼續嵌套,如果語句或創建新的類,等等。初學者OOP;更多方法與類

例如:在下面的類中,我正在尋找字符串x,y或z在我返回的HTML。如果我找到X我需要執行一個函數。在if語句下面構建函數是最有效的,或者我可以創建一個新函數並在該類中調用它(即,創建一個名爲x_Found()的新函數),以分析我需要的數據。

class Link: 
    def __init__(self, url): 
     self.url = url 
     x = 'abc' 
     y = 'zyx' 
     z = '123' 

    def get_html(self): 
     import urllib2 
     html = urllib2.urlopen(self.url()).read() 
     return html 

    def find_text(self): 
     html = self.get_html() 

     if x in html: 
      run a function called x_found() 
     elif y in html: 
      run a different function called y_found() 
     elif z in html: 
      run an even different function called z_found() 

回答

1

Lambdas字典和/或方法指針。

method_map = {'x' : self.x_found, 'y': self.y_found, 'z':self.z_found} 
strings_to_search = ['x', 'y', 'z'] 
for string in strings_to_search: 
    if string in html: 
     method_map[string]() 
+0

啊,你到了那裏第一,做得好:) – Vality 2014-08-27 23:13:21

+0

我如何將納入X/Y/z_found ()進入課堂?我是否只是在下面創建更多方法並且可以調用它們?他們必須在上面嗎? – kmomo 2014-08-27 23:16:14

+0

只要它們在同一個類塊中,它們可以高於或低於 – user2085282 2014-08-27 23:16:49

1

在這種情況下,你不應該使用if語句。創建一個將字符串映射到函數然後調用其中的適當函數的字典將會更好。

嘗試是這樣的:

def string1_found(): 
    print "Found a string 1" 

foo = {} 
foo['string1'] = string1_found 

然後,你可以調用一個由

myfunc = foo['string1'] 
myfunc() 
+0

向下投票者,請解釋這個問題,雖然這個答案很簡短,但我認爲這是一個解決方案。 – Vality 2014-08-27 23:27:04

+0

沒有'Dictionary()'和'foo ['string1'] = string1_found()'''不會允許你在後面調用'foo ['string1']()''' – 2014-08-27 23:31:21

+0

@PadraicCunningham謝謝,我是隻是懶惰,所以我很欣賞踢我鼓勵我實際看我的參考書。現在還好嗎還是我還有問題? – Vality 2014-08-27 23:36:10