2014-02-08 122 views
0

Monkey可以在Python類中修補一個屬性嗎? 「猴子修補python」的快速谷歌返回了大量修補methods的結果,但沒有提及更改類中的字段。猴子修補類中的屬性?

修補方法:

但是,就像我說的,沒有改變的類屬性提及/場。

爲了給出一個有點人爲的例子,假設我有一個類,它有一個multiprocessingqueue,我想用threading Queue.Queue修補它。

import threading 
import multiprocessing 

class MyClassWithAQueue(object): 
     def__init__(self): 
       self.q = multiprocessing.Queue() 

有沒有辦法補丁?嘗試在施工前通過類名簡單分配它看起來什麼都不做。

if __name__ == '__main__': 
     MyClassWithAQueue.q = Queue.Queue() 
     myclass = MyClassWithAQueue() 

     print myclass.q 
      # still shows as a multiprocessing queue 
     >>><multiprocessing.queues.Queue object at 0x10064493> 

有沒有辦法做到這一點?

+0

您必須創建的實例原始類然後重寫該字段的實際值,或者通過替換構造函數來爲該類補丁。但我不推薦使用猴子補丁。通常有更好的方法來解決你的問題。 – Palec

+0

首先你需要什麼猴子補丁? –

回答

1

問題是代碼在其中運行的訂單

__init__在實例化上運行,並且設置爲self.q,而不管之前是否有任何內容。您可以執行下列操作之一:它


更改爲一個類屬性:

class MyClassWithAQueue(object): 
    q = multiprocessing.Queue() 
    def __init__(self): 
     pass 

MyClassWithAQueue.q = Queue.Queue() 
myclass = MyClassWithAQueue() 
print myclass.q 

或更改實例屬性:

class MyClassWithAQueue(object): 
    def __init__(self): 
     self.q = multiprocessing.Queue() 

myclass = MyClassWithAQueue() 
myclass.q = Queue.Queue() 
print myclass.q