2014-11-04 98 views
2

對於str.split(line)我調用了一個str類的方法,並將一個線對象,恰好是一個充滿字符串的列表傳遞給字符串對象?爲什麼在line.split()上寫str.split(line)會有意義?

我似乎更清楚我應該在我的線對象上調用split()方法。

我無法理解兩種方式的工作原理。

+0

@AlexThornton:不,當作爲一個未綁定的方法調用時,它的第一個參數是要自行分割的字符串('self')。 – abarnert 2014-11-04 20:03:43

+0

問題中的第一句話似乎是錯誤的。如果'line'是一個充滿字符串的列表,'str.split(line)'和'line.split()'會引發異常(TypeError,因爲列表不是str,而且'AttributeError',因爲列表分別沒有'split'方法)。我假設你的意思是'line'是一個單獨的字符串_within_滿是字符串的列表? – abarnert 2014-11-04 20:06:48

回答

5

首先,你說得對,在這種情況下,它的可讀性更強(以及更多的Pythonic等),只需撥打line.split()即可,而不是str.split(line)

但是有沒有任何情況下str.split是有用的嗎?當然。想象一下你有一個行列表,並且你想分割所有行。哪一個是更具可讀性:

split_lines = map(str.split, lines) 
split_lines = map(lambda line: line.split(), lines) 

因爲str.split已經是任何str工作的功能,你沒有創建任何str工程繞過了新的功能。


更一般地,你要問的是,爲什麼Python有「非綁定方法」。*這部分地是因爲他們天生就掉出設計的方法Python中是如何工作的。**不過爲主,這是因爲他們可以方便地傳遞給更高階的函數(並且因爲除非有充分的理由不允許它,絕對所有東西都應該用作值)。


至於最後一部分,理解它們是如何工作的,這可能有點涉及到一個SO答案。你可以瞭解他們如何工作的基礎知識in the tutorial;有關更多詳細信息,請參閱How methods work,該鏈接指向其他有用信息。但作爲一個快速摘要:

  • line.split是綁定的方法,一個可調用的是知道什麼值傳遞爲self參數,當你以後調用它的對象。因此,line.split()只是調用該綁定方法而沒有附加參數,並且line自動作爲self傳遞。
  • str.split是一個未綁定的方法 - 基本上只是一個函數。所以,str.split(line)明確地通過line作爲self

*由於3.x中,術語「未綁定方法」已被淡化,因爲說真的,一個不受約束的方法是一樣的東西的功能。

** Guido已經解釋了幾次;從他2009年的博客文章First-Class Everything開始。

相關問題