如何在Python/PyQt5中仅获取用户自定义类?
只获取用户自定义类的解决方案
你的核心问题是当前代码会遍历模块中所有成员(包括导入的PyQt类),导致循环次数过多。要精准获取自定义类,关键是判断类的定义模块是否为当前目标模块,而非外部库。
优化思路
自定义类的__module__属性会指向它被定义的模块名,而导入的外部类(如QWidget)的__module__是其所属的外部库模块(比如PyQt5.QtWidgets)。利用这一点可以精准过滤。
修改后的代码
文件:identify_user_defined_class
import importlib import inspect file_list =["identify_user_defined_class_base"] list_class =[] dict_class = {} aa = 0 for items in file_list: module_name = importlib.import_module(items) current_module_name = module_name.__name__ # 获取当前模块名称 for class_name, class_obj in inspect.getmembers(module_name): aa += 1 print("bbbbb", aa, class_name, class_obj) # 过滤条件:是类,且定义在当前模块中 if inspect.isclass(class_obj) and class_obj.__module__ == current_module_name: source, start_line = inspect.getsourcelines(class_obj) list_class.append([start_line, class_name]) dict_class.update({class_name: class_obj}) list_class.sort()
效果说明
- 替换原有的字符串截取判断为
class_obj.__module__ == current_module_name,彻底避免了字符串匹配的脆弱性。 - 现在只会遍历到当前模块中定义的
A、B、C三个类,循环次数大幅减少,不会再处理导入的PyQt类。
内容的提问来源于stack exchange,提问作者Bala
相关产品推荐
相关产品推荐

