如何在python中将类实例复制到我的子类

时间:2016-12-19 02:40:34

标签: python pyqt copy instance subclass

我看过一些类似的答案,但似乎都没有解决我想解决的特定问题。 背景:我正在使用pyqt和QT Designer来设计我的布局。目前使用pyuic将布局转换为.py文件。 在这里我有一个QListView对象。

我想扩展QListView类,然后将这个特定实例复制到我的新类。

即。在我的ui.py文件中,我有:

self.taskList = QtGui.QListView(self.splitter)
...many other options
self.taskList.setObjectName(_fromUtf8("taskList"))

在我的mainfile.py中,我已经放了一个占位符,但是想象一下更多的方法

class MyTaskList(QtGui.QListView):
    def __init__(self, arg):
        super(self.__class__, self).__init__(arg)
        self._saved_index = self.currentIndex()

    @property
    def saved_index(self):
        return self._saved_index

    @saved_index.setter
    def saved_index(self, index):
        if isinstance(index, QtCore.QModelIndex):
            self._saved_index = index

    def foo(self, thing):
        #do something with thing and self

理想情况下,我想采用现有的taskList并复制所有属性。 即。

self.taskList = MyTaskList(self.taskList)

注意上面显然不会由于'arg',但是我尝试过类似的方法似乎没有复制所有实例属性,通过在init中使用各种形式的副本并将实例传递给MyNewClass即:

    def __init__(self, obj):
        super(self.__class__, self).__init__()
        if isinstance(obj, QtGui.QListView
            self.__dict__ = obj.__dict__.copy()
        #or
            self.__dict__.update(obj.__dict__)

其他成功但看起来很奇怪的选项包括使用类型模块和猴子补丁,如下所示:

import types

def foo(self, text):
    print("my object name {} is {}".format(self.objectName(), text))

self.taskList.foo = types.MethodType(foo, self.taskList)
self.taskList.foo('dancing')

打印:

  

我的对象名称taskList正在跳舞

然而,由于我将有一些额外的功能和3或4个额外的变量,这似乎很麻烦。

那么,每次手动修改pyuic生成的文件时,我最好的方法是什么?我也可能想在我拥有的另一个QListView实例中使用许多这些方法。

编辑:有一种方法可以使用qt designer来标记@ekhumoro,我想这可以在我的特殊情况下工作(知道这个很棒,甚至没想过!)。但是,我怎样才能在任何课程中达到同样的目标?想象一下,在上面的情况下,ui.py不受我的控制。

0 个答案:

没有答案