Python- Multiple dynamic inheritance
<p>I'm having trouble with getting multiple dynamic inheritance to work.  These examples make the most sense to me(<a href="http://stackoverflow.com/questions/21060073/dynamic-inheritance-in-python">here</a> and <a href="http://stackoverflow.com/questions/32104219/dynamic-multiple-inheritance-in-python">here</a>), but there's not enough code in one example for me to really understand what's going on and the other example doesn't seem to be working when I change it around for my needs (code below).</p>

<p>I'm creating a universal tool that works with multiple software packages. In one software, I need to inherit from 2 classes: 1 software specific API mixin, and 1 PySide class.  In another software I only need to inherit from the 1 PySide class.  </p>

<p>The least elegant solution that I can think of is to just create 2 separate classes (with all of the same methods) and call either one based on the software that's running.  I have a feeling there's a better solution.</p>

<p>Here's what I'm working with:</p>

<pre><code>## MainWindow.py

import os
from maya.app.general.mayaMixin import MayaQWidgetDockableMixin

# Build class
def build_main_window(*arg):

    class Build(arg):
        def __init__(self):
            super( Build, self ).__init__()

        # ----- a bunch of methods

# Get software
software = os.getenv('SOFTWARE')

# Run tool
if software == 'maya':
    build_main_window(maya_mixin_class, QtGui.QWidget)
if software == 'houdini':
    build_main_window(QtGui.QWidget)
</code></pre>

<p>I'm currently getting this error:</p>

<pre><code>#     class Build(arg):
# TypeError: Error when calling the metaclass bases
#     tuple() takes at most 1 argument (3 given) # 
</code></pre>

<p>Thanks for any help!</p>

<h1>EDIT:</h1>

<pre><code>## MainWindow.py

import os

# Build class 
class BuildMixin():
    def __init__(self):
        super( BuildMixin, self ).__init__()

    # ----- a bunch of methods

def build_main_window(*args):
    return type('Build', (BuildMixin, QtGui.QWidget) + args, {})

# Get software
software = os.getenv('SOFTWARE')

# Run tool
if software == 'maya':
    from maya.app.general.mayaMixin import MayaQWidgetDockableMixin

    Build = build_main_window(MayaQWidgetDockableMixin)

if software == 'houdini':
    Build = build_main_window()
</code></pre>

<p>The error in your original code is caused by failing to use tuple expansion in the class definition. I would suggest simplifying your code to this:</p>

<pre><code># Get software
software = os.getenv('SOFTWARE')

BaseClasses = [QtGui.QWidget]
if software == 'maya':
    from maya.app.general.mayaMixin import MayaQWidgetDockableMixin
    BaseClasses.insert(0, MayaQWidgetDockableMixin)

class Build(*BaseClasses):
    def __init__(self, parent=None):
        super(Build, self).__init__(parent)
</code></pre>

<p><strong>UPDATE</strong>:</p>

<p>The above code will only work with Python 3, so it looks like a solution using <code>type()</code> will be needed for Python 2. From the other comments, it appears that the <code>MayaQWidgetDockableMixin</code> class may be a old-style class, so a solution like this may be necessary:</p>

<pre><code>def BaseClass():
    bases = [QtGui.QWidget]
    if software == 'maya':
        from maya.app.general.mayaMixin import MayaQWidgetDockableMixin
        class Mixin(MayaQWidgetDockableMixin, object): pass
        bases.insert(0, Mixin)
    return type('BuildBase', tuple(bases), {})

class Build(BaseClass()):
    def __init__(self, parent=None):
        super(Build, self).__init__(parent)
</code></pre>

python class inheritance dynamic