2015-05-01 2 views
1

Хорошо, поэтому у меня проблема с кодом ниже. Он работает так, как если бы я попытался изменить часть с комментарием о том, что я не могу заставить супер работать правильно.проблемы с python с супер

pipeline_class_call = super(Error_Popup,self) 
broken_file_w_whats_wrong = pipeline_class_call.whats_wrong_with_file() 

или

broken_file_w_whats_wrong = super(Error_Popup,self).whats_wrong_with_file() 

и изменить

class Error_Popup(QtGui.QDialog): 

в

class Error_Popup(QtGui.QDialog,Pipeline_UI): 

Я получаю следующую ошибку

# TypeError: object of type 'instancemethod' has no len() # 

Что обычно означает, что мне нужно вызвать метод, но не супер обрабатывает все это для меня. Или я это делаю?

from PySide import QtCore, QtGui 
from shiboken import wrapInstance 
import pymel.core as pm 
import maya.OpenMayaUI as omui 
from UI.UI import Pipeline_UI 

def something_bad_happened_window(): 
    sbh_pointer = omui.MQtUtil.mainWindow() 
    return wrapInstance(long(sbh_pointer), QtGui.QWidget) 

class Error_Popup(QtGui.QDialog): 

    def __init__(self,parent=something_bad_happened_window()): 
     super(Error_Popup,self).__init__(parent) 

     self.setWindowTitle('Something Bad Happened!') 
     self.setWindowFlags(QtCore.Qt.Tool) 
     self.popup_layout() 
     self.setAttribute(QtCore.Qt.WA_DeleteOnClose) 
     self.connections() 

    def popup_layout(self): 
     self.file_description = QtGui.QListWidget() 


     #cant seem to get super to work appropriately... booo 
     pipeline_class_call = Pipeline_UI() 
     broken_file_w_whats_wrong = pipeline_class_call.whats_wrong_with_file() 

     for display in range(0,len(broken_file_w_whats_wrong)): 

      broken_list = QtGui.QListWidgetItem() 
      if display % 2 == 0: 
       broken_list.setText(broken_file_w_whats_wrong[display][0]) 
       broken_list.asset = broken_file_w_whats_wrong[display][1] 

      else: 
       broken_list.setText(" " + broken_file_w_whats_wrong[display][0]) 

      self.file_description.addItem(broken_file_w_whats_wrong[display]) 

     self.import_button = QtGui.QPushButton('Import Replacement(s)') 

     error_layout = QtGui.QVBoxLayout() 
     error_layout.setContentsMargins(2,2,2,2) 
     error_layout.setSpacing(2) 


     error_layout.addWidget(self.file_description) 
     error_layout.addWidget(self.import_button) 

     error_layout.addStretch() 


     self.setLayout(error_layout) 

    def connections(self): 
     self.import_button.clicked.connect(Error_Popup.make_sphere) 


    @classmethod 
    def make_sphere(cls): 
     pm.polySphere() 


def show_window(): 

    ui = Error_Popup() 

    if __name__ == '__main__': 
     try: 
      ui.close() 
     except: 
      pass 

    ui.show() 

show_window() 

Спасибо заранее всем

ответ

1

кажется мне, как это проблема использования super множественного наследования. Он выбирает одного из родителей в определенном порядке для использования. Например, super(Error_Popup,self).__init__(parent) вызывает только один из родителей __init__ методов. Вы должны вручную вызвать все из них.

При вызове методов или доступе к переменным вы должны указать, какой родитель вы хотите использовать, или super выберет для вас. См. this answer и this answer.

+0

заставляет меня подвергать сомнению действительность супер в целом. – timcoolmode

+1

Я думаю, что Super - отличный дизайн сам по себе. Но это может запутать, как это работает. В общем случае множественное наследование сложное, и вы должны знать, как работает MRO. Я думаю, это объясняет супер лучший https://www.youtube.com/watch?v=EiOglTERPEo – skar