On Sun, Feb 22, 2009 at 1:37 AM, Barak, Ron <ron.ba...@lsi.com> wrote: > Hi Chris, > >> -----Original Message----- >> From: ch...@rebertia.com [ > mailto:ch...@rebertia.com] On >> Behalf Of Chris Rebert >> Sent: Thursday, February 19, 2009 22:58 >> To: Barak, Ron >> Cc: python-list@python.org; wxpython-us...@lists.wxwidgets.org >> Subject: Re: "metaclass conflict" error: where is noconflict ? >> >> On Thu, Feb 19, 2009 at 5:01 AM, Barak, Ron <ron.ba...@lsi.com> wrote: >> > Hi, >> > >> > I have a class derived from two parents (in blue below), >> which gives >> > me the following error: >> > >> > $ python -u ./failover_pickle_demo09.py Traceback (most recent call >> > last): >> > File "./failover_pickle_demo09.py", line 291, in <module> >> > class ListControl(wx.Frame, CopyAndPaste): >> > TypeError: Error when calling the metaclass bases >> > metaclass conflict: the metaclass of a derived class must be a >> > (non-strict) subclass of the metaclasses of all its bases Googling >> > suggested I should add from noconflict import classmaker and >> > >> > __metaclass__=classmaker() >> > to this class. >> > >> > However, I don't seem able to find where to get the >> noconflict module from. >> > >> > Do any of you where noconflict could be downloaded/installed from ? >> >> From what I could google, you should in theory be able to fix >> the problem (without using any 3rd party module) by doing: >> >> class ListControlMeta(type(wx.Frame), type(CopyAndPaste)): >> pass >> >> class ListControl(wx.Frame, CopyAndPaste): >> __metaclass__ = ListControlMeta >> #rest of class... >> >> Cheers, >> Chris > > Applying your suggestion: > > class ListControlMeta(type(wx.Frame), type(CopyAndPaste)): > pass > > class ListControl(wx.Frame, CopyAndPaste): > def __init__(self, parent, id, title, list, max_list_width, log_stream, > style=wx.DEFAULT_FRAME_STYLE): > > __metaclass__= ListControlMeta > > wx.Frame.__init__(self,parent,id,title,size=(max_list_width,-1), > style=style) > self.list = list > self.log_stream = log_stream > self.list_ctrl = wx.ListCtrl(self, -1, style=wx.LC_REPORT | > wx.LC_NO_HEADER) > self.list_ctrl.InsertColumn(0, title) > for i,line_ in enumerate(list): > self.list_ctrl.InsertStringItem(i, line_) > ... > > I get: > > $ python -u ./failover_pickle_demo09.py > Traceback (most recent call last): > File "./failover_pickle_demo09.py", line 319, in <module> > class ListControlMeta(type(wx.Frame), type(CopyAndPaste)): > TypeError: Error when calling the metaclass bases > multiple bases have instance lay-out conflict
>From what I recall, that basically means that type(wx.Frame) and type(CopyAndPaste) are both C classes that are are mutually incompatible. It's basically the same reason you can't subclass from both `list` and `dict` or two other built-in types (you get the exact same error). Sounds like the only way to workaround this would be to do some coding in C or to use composition rather than inheritance for one of ListControl's superclasses. Cheers, Chris -- Follow the path of the Iguana... http://rebertia.com -- http://mail.python.org/mailman/listinfo/python-list