我正在研究简单的PyQt5应用程序,它允许我编辑一些文件,如.xml,.txt
因为我需要处理不同的文件,所以我决定实现超类,它将找到并返回适当的子类,取决于文件扩展名。
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__()
。有人可以告诉我,我做错了什么?
答案 0 :(得分:1)
WidgetHandler
的超类是(隐式)object
,因为您还没有定义显式超类。所以你打电话给object.__new__(XML)
。我用Google搜索了您的错误,发现for Python 2.6,
如果您想将参数传递给
object
或__new__
,则无法使用__init__
作为继承的终止类。
我不知道您正在使用的Python版本,但这可能是您问题的根源。
我尽量避免覆盖__new__
;对于此应用程序,您应该考虑使用factory pattern代替。