2013-08-22 96 views
1
>>> class Class: 
...  def method(self): 
...   print 'I have a self!' 
... 
>>> def function(): 
...  print "I don't..." 
... 
>>> instance = Class() 
>>> instance.method() 
I have a self! 
>>> instance.method = function 
>>> instance.method() 
I don't... 

好的書中引用了自我參數(前面提到的)實際上是區分方法 與函數的區別。方法(或者更技術上的綁定方法)將其第一個參數 綁定到它們所屬的實例:您不必提供它。所以雖然你當然可以將一個屬性綁定到一個普通函數,但它不會有這個特殊的自身參數:'python中的綁定方法

我不能理解作者在這裏傳達的東西!我是python中的新手。請解釋我。

+0

如果這是Python 2,作者要麼馬虎,要麼過時。忘記創建新風格的類通常是可原諒的,但這是新風格和經典類不同的關鍵領域之一。另外,儘管解釋對我來說很有意義,但我認爲對於那些還不知道方法是如何工作的人來說,這將是非常泥濘的。所以......我不確定我對這本書有多少信心。它是什麼書? – abarnert

+0

從新手到專業開始Python,Magnus Lie Hetland – AbKDs

+0

嗯,他肯定知道他在說什麼。我不想成爲侮辱(我確信我的關於[如何使用方法]的博客文章(http://stupidpythonideas.blogspot.com/2013/06/how-methods-work.html)將會更多_far_更多對本章比本章感到困惑......)。但是......你可能想要找到一本不同的書或者教程來學習類和方法。 – abarnert

回答

0

方法只存在於類;作爲示例,將該功能分配給實例屬性創建包含功能而不是方法的實例屬性。

+0

這在Python 3.x中是鬆散的(但在2.x中有更多的擴展),但我不認爲這對理解差異非常有幫助。 – abarnert

+0

2.x完全正確;將一個函數分配給一個類屬性,無論是在它的元類實例化類之前還是之後,都會將它變成一個方法。 –

+0

不,將函數分配給類屬性並不會將其變爲方法。看看這個班的'__dict__';它只是一個普通的舊函數(實際上是對_same_ plain舊函數的引用)。當您通過方法查找(或getattr等)訪問它時,會發生奇蹟。當在類字典中找到屬性時,將調用它的__get__方法並返回結果,並且函數的__get__方法返回綁定或未綁定的方法。 (它在3.x中是鬆散的,因爲一個未綁定的方法只是一個函數。) – abarnert

0

這意味着影響

class A: 
    def a(self): 
    print 'a' 
    def b(self, arg): 
    print arg 

可大致表示:

def A_a(self): 
    print a 

def A_b(self, arg): 
    print arg 

class A: 
    def __init__(self): 
    self.a = lambda: A_a(self) 
    self.b = lambda arg: A_b(self, arg) 

所以instance.a不是原來的功能a這是寫在class A,而是另一個函數調用原有的額外self的說法。