2011-10-13 45 views
10

加載的類/模塊,如果我有像add方法在Python

import mynewclass 

我可以添加一些方法來mynewclass?類似概念如下:

def newmethod(self,x): 
    return x + self.y 

mynewclass.newmethod = newmethod 

(我用的CPython 2.6)

+1

可能的使用:http://stackoverflow.com/questions/962962/python-changing-methods-and-attributes-at-runtime –

回答

12

在Python import語句用於模塊,而不是類...所以導入你需要像

from mymodule import MyClass 

更多你的問題點的答案是肯定的一類。在Python中,類只是常規對象,類方法只是存儲在對象屬性中的函數。

Python中的對象實例的屬性此外是動態的(您可以在運行時添加新的對象屬性),這一事實與前一個結合意味着您可以在運行時向類中添加新方法。

class MyClass: 
    def __init__(self, x): 
     self.x = x 

... 

obj = MyClass(42) 

def new_method(self): 
    print "x attribute is", self.x 

MyClass.new_method = new_method 

obj.new_method() 

這是如何工作的?當您鍵入

obj.new_method() 

Python會執行以下操作:

  1. new_method對象obj內。

  2. 沒有找到它作爲實例屬性,它會嘗試尋找類對象的內部(可用作obj.__class__),它將在其中找到該函數。

  3. 現在有點小小的詭計,因爲Python會注意到它發現的是函數,因此將它「包裝」在閉包中以創建所謂的「綁定方法」。這是必要的,因爲當您撥打obj.new_method()時,您想調用MyClass.new_method(obj) ...換句話說,將函數綁定到obj以創建綁定方法是需要注意添加self參數的操作。

  4. 此綁定方法是由obj.new_method返回的內容,然後這將最終調用,因爲該行代碼上的結尾()

如果該類的搜索也不會成功,而不是父類也都以特定的順序查找繼承的方法和屬性,因此搜索的東西更復雜的只是一點點。

5

是的,如果它是一個Python類型。除了你會在課堂上做,而不是模塊/包裝。