我想在運行時覆蓋(修補)一個類。在我的情況下,我使用gui2py,並且要覆蓋它的一些功能來支持MenuItems中的圖像,但不更改最終程序的代碼。Python:覆蓋(猴子修補)類
即我已經
overrides.py
import gui,wx
# this is the tricky line
gui.MenuItem.image = gui.component.InitSpec()
def menu__init__(self, parent, *args, **kwargs):
gui.menu.wx_DummyWindow.__init__(self, parent, *args, **kwargs)
wx.MenuItem.__init__(self, parentMenu=parent,id=kwargs['id'],text=kwargs['label'],kind=kwargs['style'])
if self.GetKind() == wx.ITEM_SEPARATOR:
self.parent.AppendSeparator()
else:
self.SetHelp(kwargs['help'])
# The next is added code
img = kwargs.get("image")
if img:
self.SetBitmap(wx.Bitmap(img))
self.parent.AppendItem(self)
gui.menu.wx_MenuItem.__init__ = menu__init__
program.py
from overrides import *
with gui.Window(name='win', ):
with gui.MenuBar(name='menu',):
with gui.Menu(label=u'File', name='file',):
gui.MenuItem(label=u'Quit', name='quit', image='quit.png')
gui.main_loop()
這是行不通的。
但是如果我直接修改GUI/menu.py
class MenuItem(Component):
#add this line
image = InitSpec()
然後它
Download This進行工作演示
我想問題是你通過將函數設置爲類屬性來修補'__init__'。在這樣做之前,你應該把它變成一個[實例方法](https://docs.python.org/2/library/types.html#types.MethodType)。 –
不知何故'__init__'按預期工作,它是改變的類屬性_image_。如果它直接在源代碼中修改或覆蓋 – Magen
那麼你的錯誤信息是什麼? –