"metaclass conflict" error: where is noconflict ?

Chris Rebert clp2 at rebertia.com
Sun Feb 22 10:47:38 CET 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