python pyside pyqt reload TypeError: super(type, obj): obj must be an instance or subtype of type
一開始遇到這個問題,在網上找了不少解決方法,這里提供鏈接僅供參考:https://blog.csdn.net/likesubject/article/details/104472778,https://iwwxiong.com/2019/07/02/python_super_TypeError/
不過都不能從根本上解決我遇到的問題,在我的模塊中有一個全局變量,是一個pyqt mainWindow 對象,在reload這個模塊后,這個對象會有一個野地址,然后重新reload一個新的,也就是說這個野地址的對象沒有被釋放,它的一些事件線程還會觸發(例如event事件),不過受到這些參考加上之前pyside幫助文檔里面看到的關於垃圾回收的問題:
不過網上看到有大神說這個解釋是針對C++的,在pyqt中,如果一個widget的parent為None,而這個widget被檢測到成為野地址,會自動被回收(鏈接找不到了)。
然后我抱着嘗試的心態,在reload之前,把mainWindow對象的parent設置為None,mainWindow.setParent(None)(突然覺得setParent在python中如此好用),然后reload,果然成功了,事件線程也不再多余的運行,也不會報錯,從根本上解決了問題。
我也嘗試了del 對象,發現沒有用。
以后可以放心的reload了。
但是還有一個問題,如果當前對象在啟動的狀態下,通過其它方式去reload了當前對象所在的模塊,那么也會出現以上的報錯,因為所依賴的class被reload了,所以在調用的時候,不要以這種方式:
super(YourClassType, self).event(event)
最好以這種方式:
ParentClassType.event(self,event)