2010-10-27 71 views
5

我有下面的代碼,我想了解:瞭解__call__和list.sort(鍵)

>>> class DistanceFrom(object): 
     def __init__(self, origin): 
      self.origin = origin 
     def __call__(self, x): 
      return abs(x - self.origin) 

>>> nums = [1, 37, 42, 101, 13, 9, -20] 
>>> nums.sort(key=DistanceFrom(10)) 
>>> nums 
[9, 13, 1, 37, -20, 42, 101] 

誰能解釋這是如何工作?據我所知,__call__是調用object()時調用的 - 調用該對象作爲函數。我不明白的是nums.sort(key=DistanceFrom(10))。這個怎麼用?任何人都可以請解釋這一行嗎?

謝謝!

回答

7

在這裏,我已經定義了一個函數DistanceFrom()可以以類似的方式到您的類可以使用,但可能會更容易跟隨

>>> def DistanceFrom(origin): 
...  def f(x): 
...   retval = abs(x - origin) 
...   print "f(%s) = %s"%(x, retval) 
...   return retval 
...  return f 
... 
>>> nums = [1, 37, 42, 101, 13, 9, -20] 
>>> nums.sort(key=DistanceFrom(10)) 
f(1) = 9 
f(37) = 27 
f(42) = 32 
f(101) = 91 
f(13) = 3 
f(9) = 1 
f(-20) = 30 
>>> nums 
[9, 13, 1, 37, -20, 42, 101] 

所以你看到,DistanceFrom返回的對象是稱爲一次的nums每個項目,然後nums是根據返回的值返回的有序

+0

謝謝!太棒了。 – user225312 2010-10-27 14:58:32

+0

@阿爾弗雷德,你最歡迎 – 2010-10-27 15:01:43

4

它使用key功能對象DistanceFrom(10)nums排序。它需要被調用,因爲key需要被調用。結果輸出按10的「遠程」排序,即9是最接近10的值,101是最遠的值。

對象被初始化之後,並通過作爲key參數到sort方法,在每次迭代,將與當前的值被調用(這就是x是),並返回值將被用於確定在的x位置結果列表。

+0

這是如何執行的?我的意思是,DistanceFrom(10)設置self.origin = 10.之後呢? – user225312 2010-10-27 14:45:08

+0

@Alfred:看到我的編輯 – SilentGhost 2010-10-27 14:47:44

+0

「__ init __」是一個構造函數,在創建Object鍵時被調用 – OlimilOops 2010-10-27 14:48:09

8

__call__ python允許類運行,就好像它是一個函數。您可以手動嘗試此操作:

>>> dis = DistanceFrom(10) 
>>> print dis(10), dis(5), dis(0) 
0 5 10 
>>> 

對列表中的每個項目都調用該函數,並將返回的值用作排序關鍵字。在這個例子中,你會得到一個列表,其中最接近10的項目是第一個,而最後一個的項目更遠。

+0

啊。這很好。 – user225312 2010-10-27 14:52:21

+0

@user:你的回答很完美,但我接受了gnibbler的回答,因爲如果他們搜索它,對初學者會有好處。 – user225312 2010-10-27 15:42:42

1

當你打電話的時候,這意味着你期待它返回一個值。當你創建一個定義了__call__方法的類時,你可以指定該類的一個實例可以像函數那樣工作。

對於這個問題的目的,這樣的:

class DistanceFrom(object): 
     def __init__(self, origin): 
      self.origin = origin 
     def __call__(self, x): 
      return abs(x - self.origin) 

在功能上等同於:

def distance_from(origin, other): 
    return abs(other - origin) 

至於key參數進行排序,這裏是你的解釋直接從Python文檔:

key詳細說明一個 參數的函數,該參數用於從每個列表元素提取一個 比較鍵: key=str.lower。默認值是 無(直接比較的元素)

1

只要我發現我不瞭解基本原理,Python文檔就非常好。我找到這些與谷歌。

The key parameter是sort將調用列表中的元素的函數。我通過搜索sort site:http://docs.python.org/找到該文檔,然後搜索key=

__call__是一個函數,您可以添加到一個對象,使該對象可以調用,就好像它是一個函數。我通過搜索__call__ site:http://docs.python.org/發現了該文檔,然後查看__call__的文檔鏈接。

+0

我明白他們是什麼,我的問題是特定於這個例子。 – user225312 2010-10-27 14:56:47