2016-10-05 4 views
0

다중 동적 상속이 작동하는 데 문제가 있습니다. 이 예제는 나에게 가장 이해가되지만 (herehere), 한 가지 예제에서는 실제로 무슨 일이 일어나고 있는지 이해할 수있는 코드가 충분하지 않으며, 다른 예제는 내 필요에 맞게 바꿀 때 작동하지 않는 것처럼 보입니다. 아래 코드 참조).파이썬 - 다중 동적 상속

여러 소프트웨어 패키지와 함께 작동하는 보편적 인 도구를 만들고 있습니다. 하나의 소프트웨어에서, 나는 2 개의 클래스로부터 상속 할 필요가있다 : 1 개의 소프트웨어 특정 API 믹스 인, 1 개의 PySide 클래스. 다른 소프트웨어에서는 PySide 클래스를 상속 받아야합니다.

제가 생각할 수있는 가장 섬세한 해결책은 2 개의 별도 클래스 (모든 동일한 메소드 포함)를 만들고 실행중인 소프트웨어를 기반으로 하나를 호출하는 것입니다. 더 나은 해결책이 있다는 느낌이 들었습니다.

는 여기에 내가 함께 일하고 있어요 무엇 : 어떤 도움

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

감사 : 나는 현재이 오류를 받고 있어요

## 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) 

!

편집 :

## 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() 
+1

합니다. 동적 다중 상속을 원하면'type (name, bases, dct)'를 사용하십시오. – jonrsharpe

+0

오류를 피하려면 * arg를 사용하기 전에 별표를 추가하십시오. class Build (* arg).생성자 내부의 super에 대한 호출은 당신이 arg로 전달하는 것에 따라 다른 것들을 호출 할 수 있습니다. – jerry

답변

2

원래 코드의 오류는 클래스 정의에서 튜플 확장을 사용하지 않아서 발생합니다. 나는이에 코드를 단순화 제안 :

# 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) 

UPDATE :

가에서 파이썬 2. 필요합니다 type()를 사용하여 솔루션처럼 보이는, 그래서 위의 코드는, 파이썬 3와 함께 작동합니다 다른 의견, MayaQWidgetDockableMixin 클래스는 이전 스타일의 클래스가 될 수 있음을 표시하므로이 같은 솔루션이 필요할 수 있습니다 :`자체 args`의 튜플을 하위 클래스하려고하기 때문이다

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) 
+0

답장을 보내 주셔서 감사합니다, 에쿠 모모! 'class Build (* BaseClasses) :'의 별표에서 구문 오류가 발생합니다. IDE에서 오류가 발생합니다. 직접 코드를 복사하여 붙여 넣기조차도 오류를 표시합니다. 이 확장 방법에 익숙하지 않지만 작동 시키려면 함께 갈 수있는 것처럼 보입니다. 왜 내가이 오류가 발생하는지 어떤 생각? –

+0

@MikeBourbeau. 젠장 - 파이썬 3에서는 작동하지만 파이썬 2에서는 작동하지 않는 것처럼 보입니다. – ekhumoro

+0

그래, 나는 마야 2017 때문에 어떤 시점에서 파이썬 3으로 옮겨야 만한다. 어쩌면 이것이 내가 마이 그 레이션을 시작하는 날일 수도있다. –

1

arg은 튜플입니다, 당신은 기본 클래스로 튜플을 사용할 수 없습니다.

대신 type()을 사용하여 새 클래스를 만드십시오. 클래스 이름, 기본 클래스의 튜플 (비어있을 수 있음) 및 클래스 본문 (사전)을 사용합니다.

나는 혼합 된 방식으로 클래스에 대한 방법을 유지하는 것 : 여기

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

    # ----- a bunch of methods 

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

if software == 'maya': 
    Build = build_main_window(maya_mixin_class) 
if software == 'houdini': 
    Build = build_main_window() 

, args가 상속하는 클래스의 추가 세트로 사용된다. BuildMixin 클래스는 모든 실제 메서드를 제공하므로 type()의 세 번째 인수는 비어 있습니다 (생성 된 Build 클래스에는 클래스 본문이 비어 있음).

QtGui.QWidget은 두 클래스간에 공통적이므로 type() 호출로 이동했습니다.

+0

빠른 답장을 보내 주셔서 감사합니다. 내 스크립트를 설정했지만 지금이 오류가 발생했습니다 : '반환 형식 ('Build', (BuildMixin, QtGui.QWidget) + args, {}) ' '# TypeError : 잘못된 기본 클래스 Shiboken.ObjectType 형식에서 사용됩니다. PySide는 파이썬의 새로운 스타일 클래스에서 다중 상속만을 지원합니다. ' 이 클래스가 어떻게'오래된 '스타일인지 확실하지 않습니다. 위의 내 게시물에서 내가 사용하는 코드를 확인하십시오. –

+1

@MikeBourbeau : 죄송합니다. ekhumoro가 지적했듯이,'MayaQWidgetDockableMixin'은 구식 클래스이므로 여기에'object'를 추가해야합니다. –