gpt4 book ai didi

python - PyQt5。多重继承和 __new__

转载 作者:太空宇宙 更新时间:2023-11-03 15:37:09 25 4
gpt4 key购买 nike

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

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

因为我需要处理不同的文件,所以我决定实现父类(super class),它将根据文件扩展名找到并返回适当的子类。

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

但是我得到的不是 widget,而是这个异常:object.__new__(XML) is not safe, use QTreeView.__new__()。有人可以告诉我,我做错了什么吗?

最佳答案

WidgetHandler 的父类(super class)(隐式)是 object,因为您尚未定义显式父类(super class)。所以您正在调用object.__new__(XML)。我用 Google 搜索了你的错误,发现 for Python 2.6 ,

You can't use object as the terminating class for your inheritance if you want to pass arguments to __new__ or __init__.

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

一般情况下我会尽量避免覆盖__new__;对于此应用程序,您应该考虑使用 factory pattern相反。

关于python - PyQt5。多重继承和 __new__,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42442519/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com