Python类继承能否用变量?PyQt中form_class继承疑问
Python类继承中使用变量的合法性解释
核心结论
Python类定义时,继承列表里允许使用任何能求值为类对象的表达式,包括变量,并非只能写类名字面量。
针对你的代码的具体解释
form_class的本质
uic.loadUiType("C:\PyQT tutorial\1.Hello pyQT\notepad.ui")[0]返回的是一个元组,其中第一个元素是PyQt根据.ui文件动态生成的类对象。所以你定义的form_class变量,本质上是对这个动态类对象的引用,它的类型是type——这完全合理,因为Python里所有类都是type的实例(包括你自己定义的类、PyQt的QMainWindow等)。继承列表的规则
你看到的class WindowClass(QMainWindow, form_class)中:QMainWindow是类名字面量,但它本质上也是一个指向类对象的变量(Python中类名就是指向类实例的引用);form_class是你自己定义的变量,同样指向一个类对象,所以放在继承列表里完全符合Python语法。
关于mro()的输出
form_class.mro()是调用类的mro()方法,这个方法会返回该类的方法解析顺序列表,所以type(form_class.mro())输出<class 'list'>是正常的,它和form_class本身是类对象并不冲突。
总结
PyQt的uic.loadUiType()就是通过动态生成类的方式,让你可以继承UI对应的类,结合QMainWindow来实现界面与逻辑的分离。这种写法完全符合Python的类继承语法,不用纠结变量能不能放在继承列表里——只要变量指向的是类对象,就没问题。
内容的提问来源于stack exchange,提问作者JaeKwan Kim
相关产品推荐
相关产品推荐

