"metaclass conflict" error: where is noconflict ?
Chris Rebert
clp2 at rebertia.com
Sun Feb 22 04:47:38 EST 2009
On Sun, Feb 22, 2009 at 1:37 AM, Barak, Ron <Ron.Barak at lsi.com> wrote:
> Hi Chris,
>
>> -----Original Message-----
>> From: chris at rebertia.com [
> mailto:chris at rebertia.com] On
>> Behalf Of Chris Rebert
>> Sent: Thursday, February 19, 2009 22:58
>> To: Barak, Ron
>> Cc: python-list at python.org; wxpython-users at lists.wxwidgets.org
>> Subject: Re: "metaclass conflict" error: where is noconflict ?
>>
>> On Thu, Feb 19, 2009 at 5:01 AM, Barak, Ron <Ron.Barak at 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
More information about the Python-list
mailing list