2014-04-12 58 views
3

我正在學習關於python的教程。它解釋了函數如何成爲Python中的第一類對象。函數是python中的第一類對象嗎?

def foo(): 
     pass 
print(foo.__class__) 

print(issubclass(foo.__class__,object)) 

,我得到了上面的代碼輸出

<type 'function'> 
True 

這個程序應該是證明函數是蟒蛇第一類對象?我的問題如下。

  1. 上述代碼如何證明函數是第一類對象?
  2. 第一類對象的屬性是什麼?
  3. function.__class__是什麼意思?它返回一個元組<type,function>這並不意味着什麼?
+3

它__has__一個類的事實使它成爲一個拳頭[SIC]類對象 – Wolph

+0

所以python中的所有東西都有__class__成員在裏面嗎?並且輸出表示它是函數類型的對象? – liv2hak

回答

2

您證明函數是第一類對象,因爲您允許將foo作爲參數傳遞給方法。

第一類對象的屬性是很好的總結了這個帖子:https://stackoverflow.com/a/245208/3248346

根據不同的語言,這可以 暗示:

  • 是表達作爲一個匿名的文字值
  • 可存儲在變量中
  • 可存儲在數據結構中
  • 具有固有標識(獨立於任何給定名稱的)
  • 是用於與其它實體平等可比10
  • 是差強人意作爲參數給一個過程/功能
  • 是可回收作爲程序/功能
  • 的結果
  • 在運行時被constructible
  • 是可印刷
  • 是可讀
  • 是分佈式過程
  • 傳人3210
  • 是可存儲之外運行的進程
+0

我們在談論哪種方法?打印?我們通過foo .__ class__來打印,而不是foo本身。據我所知foo .__ class__是foo的一個屬性(或成員變量)? – liv2hak

6

First-class只是意味着功能可以作爲一個值來處理 - 也就是說,你可以將它們分配給變量,從函數返回他們,以及在將它們作爲一個參數。也就是說,你可以做這樣的代碼:

>>> def say_hi(): 
     print "hi" 
>>> def say_bye(): 
     print "bye" 
>>> f = say_hi 
>>> f() 
hi 
>>> f = say_bye 
>>> f() 
bye 

這是非常有用的,你現在可以將功能分配給變量就像任何普通的變量:

>>> for f in (say_hi, say_bye): 
     f() 
hi 
bye 

或者寫高階函數(即取功能參數) :

>>> def call_func_n_times(f, n): 
     for i in range(n): 
      f() 
>>> call_func_n_times(say_hi, 3) 
hi 
hi 
hi 
>>> call_func_n_times(say_bye, 2) 
bye 
bye 

關於__class__在蟒蛇告訴你對象有什麼type。例如,如果你在python中定義一個列表對象:a = [1,2,3],那麼a.__class__將是<type 'list'>。如果你有一個日期時間(from datetime import datetime,然後d = datetime.now(),然後d實例的類型將是<type 'datetime.datetime'>。他們只是表示在Python的功能是不是一個全新的概念,它是<type 'function'>只是一個普通的對象。

11

這裏的什麼圭多說,在他的博客第一類對象:

我的目標之一爲Python是爲了讓這個所有對象都是這樣,我的意思是,我想這可能是所有對象「一流」。以語言命名(例如,整數,字符串,函數,類,模塊,方法等)以具有相同的狀態。也就是說,它們可以分配給變量,放入列表中,存儲在字典中,作爲參數傳遞,等等。

whole blog post值得一讀。

在你發佈的例子中,教程可能會指出第一類對象通常是「對象」類的後代。

2

關於你的第三個問題,<type 'function'>不是元組。 Python的元組符號是(a,b),而不是尖括號。

foo.__class__返回類對象,即表示foo所屬的類的對象;類對象碰巧在解釋器中產生描述性字符串,在這種情況下,告訴您foo的類是type,稱爲'function'。 (類和類型基本上都是在現代的Python一樣)

這並不意味着比其他一大堆,像任何其他對象,函數有一個類型:

>>> x = 1 
>>> x.__class__ 
<type 'int'> 

>>> y = "bar" 
>>> y.__class__ 
<type 'str'> 

>>> def foo(): pass 
... 
>>> foo.__class__ 
<type 'function'> 
1

關於您的意見@IKs回答,f_at_2()以下將是方法

def f_at_2(f): 
    return f(2) 

def foo(n): 
    return n ** n 

def bar(n): 
    return n * n 

def baz(n): 
    return n/2 

funcs = [foo, bar, baz] 

for f in funcs: 
    print f.func_name, f_at_2(f) 

...

>>> 
foo 4 
bar 4 
baz 1 
>>> 

的方法是的函數/在一類,但概念也適用於功能(一類的外部)。函數(作爲對象)包含在數據結構中並傳遞給另一個對象。

相關問題