2014-04-28 88 views
2
class A(object): 

    def a(self, b=1): 
     print 'Up' 
    d = {1 : a} 

    def b(self): 
     print self.d[1] 
     print self.b 
     print self.d[1].__get__(self, A)() 
     # print self.d[1]() 

class B(object): 


    def a(self): 
     print 'here??' 
     return 10000 
    d = {1 : a} 
    def b(self): 
     print 'hurray' 

o = A() 
o.b() 

b = B() 
type(o).__dict__['b'].__get__(b, type(b))() 

嗨夥計,綁定的方法到另一個類

我正在經歷Python: Bind an Unbound Method?http://users.rcn.com/python/download/Descriptor.htm,並試圖嘗試對我的學習。

不過,我現在已經擊出了一些新的疑惑: -

  1. 在我的代碼的最後一行,我能夠使用__get__b對象和實例:type(b)。這隻適用於在class B中定義方法b。爲什麼這樣?
  2. 即使最後一行要求我在class B提供一種方法b,還在class Ab被調用的方法。爲什麼這樣?
  3. 我非常驚訝,在上述步驟後,我注意到class A的方法a未被方法b的代碼調用class A;相反,它調用class B的方法a。爲什麼這樣?

看到這種行爲後我很困惑。我可能還需要了解更多描述符。但是,這將是一個很大的幫助,如果你能回答我的疑惑

回答

2

在我的代碼的最後一行,我能夠使用__get__與B對象和實例:type(b)。這隻適用於在class B中定義方法b。爲什麼這樣?

你必須B類中定義的方法b,因爲在A.b你有print self.b。這裏,self是B類的一個實例,所以self.b表示「b方法屬於此B」,而不是「屬於此方法存在類的b方法」。如果刪除print self.b,那麼即使B沒有b,代碼也可以正常工作。

即使最後一行要求我提供class B的方法b,還在class Ab被調用的方法。爲什麼這樣?

A.b正在被調用,因爲您明確使用type(o).__dict__['b']訪問它。無論您將該方法綁定到A實例還是B實例並不重要,它仍然是A.b

要我說出吃驚的是,上述步驟後,我注意到法class Aa不受法的class Ab的代碼調用;相反,它調用class B的方法a。爲什麼這樣?

即使b屬於類A,你傳遞給它的self仍是B類的一個實例。您在self上訪問的任何屬性將爲B屬性,並且您調用的任何方法都將爲B方法。

+0

謝謝凱文。但是,你能否解釋一下我們可以使用type(o).__ dict __ ['b'] .__ get __(b,type(b))()'而不是'ob__get __( b,類型(b))()'? 換句話說,將A類的方法'b'綁定到''B類'是可能的嗎?如果是,那麼它的實際用例如何以及是什麼? – GodMan

+0

「是否有可能將A類的方法b綁定到B類?」這正是你在你的代碼中所做的。讓'self'假裝它是A的一個實例完全是另一回事。無論如何,我不認爲這有任何實際用途。良好的OO代碼不應試圖「欺騙」環境,使其認爲某個對象屬於它實際上不屬於的類。 – Kevin

+0

感謝您回答我所有的疑問。 – GodMan

相關問題