Python的:更改类型与装饰,并保持它的方法(Python: Change class type

2019-10-22 11:09发布

我想创造出可以在不同应用程序和它们的API中被用来创建UI的类。 为此我创建了一个名为ui.py模块。 这里面模块如下:

from PyQt4 import QtGui


def CreateGui(uiFile, parent=None):
    print "Ui build.."

def GetUiObject(uiClass):
    pUI = uiClass.PARENT
    class ParentUI(pUI):
        def __init__(self, uiFile):
            CreateGui(uiFile, self)
        def __call__(self, cls):
            for func in uiClass.__dict__:
                setattr(cls, func, uiClass.__dict__[func])
    return ParentUI

@GetUiObject
class UI(object):
    PARENT = QtGui.QMainWindow

    def __init__(self, uiFile):
        CreateGui(uiFile)

在我的管道模块模块,用于应用程序:

from ui import UI

UI.PARENT = QtGui.QWidget

class Tool_UI(UI):
    def __init__(self, uiFile):
        super(Tool_UI, self).__init__(uiFile)
        print "In Application"


app = QtGui.QApplication(sys.argv)
A = Tool_UI("C:/test/testUi.ui")
A.CreateGui()

但我得到以下错误:

Ui build..
In Application
Traceback (most recent call last):
  File "C:/test/maxUi.py", line 13, in <module>
    A.CreateGui()
RuntimeError: super-class __init__() of type Tool_UI was never called

什么是我错了?

编辑:

cpburnz解答了为什么代码示数,但它仍然没有工作。 我想用另一个具有不同的基地,以取代类。 我打开了一个新的问题与我的问题的一个更好的描述和不同的解决方案我想( 如何变基或动态地用不同的基类替换类 )。

Answer 1:

这看起来涉及到的Python:RuntimeError:%S从来没有所谓的超一流__init __() ,但你的设置是怎么样的不同,所以我会推断,使其更加清晰。

Traceback (most recent call last):
  File "C:/test/maxUi.py", line 13, in <module>
    A.CreateGui()
RuntimeError: super-class __init__() of type Tool_UI was never called

这意味着某处的类层次结构Tool_UIsuper(...).__init__(...)不会被调用。 这似乎是由提高QObjectQWidget 。 纵观中定义的类GetUiObject()还有就是即使父类超级的init没有呼叫pUIQWidget 。 你最有可能需要添加一个调用初始化超有:

def GetUiObject(uiClass):
    pUI = uiClass.PARENT

    class ParentUI(pUI):

        def __init__(self, uiFile):
            super(ParentUI, self).__init__() # <-- Missing.
            CreateGui(uiFile, self)

        def __call__(self, cls):
            for func in uiClass.__dict__:
                setattr(cls, func, uiClass.__dict__[func])

    return ParentUI


文章来源: Python: Change class type with decorator and keep it's methods