2012-03-11 54 views
0

就像標題說。 例如: 我有一類這樣的:如何爲之前創建的類添加新的函數?

class NewClass(): 
    def func1(): 
     ..... 

那麼我想添加一個新功能到此類程序文件運行時。 就像重新分配新的值類的屬性。 例如

NewClass.a = 3 
+2

爲什麼你需要添加它,而它是_running_而不是在源代碼? – jlarson 2012-03-11 23:57:40

+0

這聽起來並不correct..if可能你能「編輯」你的答案,並提供一些關於你做什麼方面的,也許我們可以幫助你得到你想要的結果,而無需編輯正在運行的程序? – 2012-03-12 00:02:44

回答

4

如果你想添加一個函數類的類型本身,你可以爲它分配,確保包括通過對自我參照的說法:

>>> class Quz(object): 
...  def __init__(self): 
...   self.a = "A" 
... 
>>> def qux(self): 
...  print self.a 
... 
>>> Quz.qux = qux 
>>> q = Quz() 
>>> q.qux() 
A 

您可以使用types.MethodType()創建綁定實例方法,如果你只是想給函數添加到類的一個實例:

>>> import types 
>>> class Foo(object): 
...  def __init__(self): 
...   self.a = "A" 
... 
>>> def bar(self): 
...  print self.a 
... 
>>> f = Foo() 
>>> f.bar = types.MethodType(bar, f, Foo) 
>>> f.bar() 
A 
0

這是相同的過程添加非函數類型的屬性:

對於整個類:

>>> class Foo(object): 
... pass 
>>> Foo.baz = lambda self: "Foobaz" 
>>> f = Foo() 
>>> f.baz() 
'Foobaz' 

編輯

這裏的東西要做,除非你是光榮懶惰,並且知道並不關心利弊等同於Amber在她的評論中指出。

對於一個實例:

>>> bar = Foo() 
>>> bar.biz = lambda: "barbiz" 
>>> bar.biz() 
'barbiz' 
+0

只分配一個函數不會將它綁定到實例,因此函數在調用時不會獲得對實例的引用。 – Amber 2012-03-12 00:06:09

+0

沒錯,這就是爲什麼我扔第二位 - 'self'是參考。這個問題有點模棱兩可,所以我認爲他們可能一直在整個班級中扮演一個角色。 – Nate 2012-03-12 00:09:18

+0

如果將第一部分(實例),我會脫下downvote。 – Amber 2012-03-12 00:16:39

相關問題