我的目标是只获取用户定义的类.试着做以下几件事,但我会上所有的课.所以请建议,如何只获取用户定义的类,而不是所有的类.在我的例子中,每个文件大约迭代/循环200次(我只需要前三个项Class A、Class B和Class C).如何仅获取用户定义的类.

File : 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)

    for class_name,class_obj in inspect.getmembers(module_name):
        aa = aa+1
        print("bbbbb", aa,class_name,class_obj)
        if inspect.isclass(class_obj) and str(class_obj)[0:12] != "<class 'PyQt":
            source, start_line = inspect.getsourcelines(class_obj)
            list_class.append([start_line,class_name])
            dict_class.update({class_name:class_obj})
    list_class.sort()

File : identify_user_defined_class_base

from PyQt5.QtWidgets import *

class A(QWidget):
    pass

class B(QWidget):
    pass

class C(QWidget):
    pass

推荐答案

简单的解决方案是将类的__module__属性与导入的模块的名称进行比较.此属性指定在其中定义类的模块,因此足以将其与所有其他导入或内置的类区分开来.

因此,在您的示例中,您可以简单地执行以下操作:

if inspect.isclass(class_obj) and class_obj.__module__ == items:
    ...

然而,尽管这对于您的直接用例来说可能已经足够好了,但它不是一个特别健壮的解决方案.它的一个明显问题是,它不能很好地处理子类.例如,考虑如下所示的模块:

from PyQt5.QtWidgets import QWidget

class BaseClass(QWidget):
    def commomMethod(self):
        ...

class ClassA(BaseClass):
    ...

class ClassB(ClassA):
    ...

对于您的用例,我假设您会希望包括ClassAClassB,但103BaseClass.然而,对于像这样的系统,不允许这种非常常见的子类化形式可能太严格了.因此,通常的解决方案是定义一个特殊的基类,它显式地标记您想要导入的类.这意味着上面的模块将如下所示:

from PyQt5.QtWidgets import QWidget
from mymodule import MarkerClass

class BaseClass(QWidget): ...
class ClassA(BaseClass, MarkerClass): ...
class ClassB(ClassA): ...

然后,您的进口商代码将如下所示:

from mymodule import MarkerClass
...

if (inspect.isclass(class_obj) and class_obj is not MarkerClass and
    issubclass(class_obj, MarkerClass)):
    ...

其中MarkerClass可以只是一个空类定义,如下所示:

class MarkerClass: pass

从长远来看,这种方法将更加健壮,更易于维护,并且在设计动态导入的类时允许更大的灵活性.

Python相关问答推荐

python中csv. Dictreader. fieldname的类型是什么?'

当条件满足时停止ODE集成?

如何在PythonPandas 中对同一个浮动列进行逐行划分?

如何训练每一个pandaprame行的线性回归并生成斜率

每次查询的流通股数量

为什么在Python中00是一个有效的整数?

BeatuifulSoup从欧洲志愿者服务中获取数据和解析:一个从EU-Site收集机会的小铲子

如何在Python中创建仅包含完整天数的月份的列表

使用元组扩展字典的产品挑战

如何仅使用数据帧操作获得特定的唯一数据帧组合?

如何正确设置ALLOWED_HOST以允许网络中的其他计算机访问Web

在动态创建带有图像的按钮时遇到问题

Regex模式在Python中不起作用,但在RegExr上?

Django在两个领域进行连接

第一行中的Pandas 按条件替换

无法在没有echo的情况下判断macOS上Python中按下的键

Pandas 具有多列和数据帧条件的功能

如何才能将文本文件分成多列,但仅限于特定的行?

在matplotlib中将标题的一部分设置为粗体和正常

如何添加脊椎箭头和偏移脊椎