PyQt5。多重继承和__new__

时间:2017-02-24 15:34:51

标签: python python-3.x pyqt pyqt5

我正在研究简单的PyQt5应用程序,它允许我编辑一些文件,如.xml,.txt

这就是现在的样子: enter image description here

因为我需要处理不同的文件,所以我决定实现超类,它将找到并返回适当的子类,取决于文件扩展名。

class WidgetHandler:
    def __new__(cls, path, parent=None):
        ext = os.path.splitext(path)[1].replace('.', '')
        for subclass in cls.__subclasses__():
            if subclass.__name__.lower() == ext:
                return super().__new__(subclass)
        raise NotImplementedError

    def __init__(self, parent, path):
        self._path = path
        self._parent = parent
        self._is_modified = False
        self._create()

    def _create(self):
        raise NotImplementedError

    def _save(self):
        raise NotImplementedError

    def _close(self):
        raise NotImplementedError

    def save(self) -> None:
        if self._is_modified:
            self._save()
            self._is_modified = False

    def close(self) -> None:
        if self._is_modified:
            pass  # TODO Запрос сохранения
        self._close()


class XML(WidgetHandler, QTreeView):
    def _create(self):
        self.setParent(self._parent)
        model = DomModel(self._path)
        # model.dataChanged.connect(lambda: print('Data Changed'))
        self.setModel(model)
        self.expandAll()
        self.setRootIsDecorated(False)
        self.setItemsExpandable(False)
        delegate = XMLDelegate()
        self.setItemDelegate(delegate)

    def _save(self):
        pass

    def _close(self):
        pass

但是我得到了这个例外而不是小部件:object.__new__(XML) is not safe, use QTreeView.__new__()。有人可以告诉我,我做错了什么?

1 个答案:

答案 0 :(得分:1)

WidgetHandler的超类是(隐式)object,因为您还没有定义显式超类。所以你打电话给object.__new__(XML)。我用Google搜索了您的错误,发现for Python 2.6

  

如果您想将参数传递给object__new__,则无法使用__init__作为继承的终止类。

我不知道您正在使用的Python版本,但这可能是您问题的根源。

我尽量避免覆盖__new__;对于此应用程序,您应该考虑使用factory pattern代替。

相关问题