【发布时间】:2017-10-05 21:21:08
【问题描述】:
我想在运行时覆盖(修补)一个类。在我的情况下,我使用 gui2py 并希望覆盖它的一些功能以支持 MenuItems 中的图像,但不更改最终程序的代码。
即我有
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__,只需将函数设置为类属性。你应该在这样做之前把它变成instance method。 -
__init__以某种方式按预期工作,是类属性 image 进行了更改。如果直接在源码中修改或者覆盖 -
那你的错误信息是什么?
标签: python class overriding monkeypatching class-variables