python - 如何检查一个类是否已在同一模块中的另一个类中使用?

标签 python python-3.x class oop

我有一个包含多个类的模块。一个类,比如 A,依赖于另一个类,比如 B, A 有一个创建 B 的对象并使用它的方法。请注意,这里不涉及继承,只是 A 依赖 B 的简单事实。

我一直在使用名为 ModuleUseCollector 的自定义类,并访问源模块文件以检查某个模块是否已在另一个模块中使用。但是,我不知道如何检查一个类是否已在同一模块的另一个类中使用。

举一个最小可行的例子:

class CarPollutionPermit:
    def __init__(self):
        self.permit = False

    def check_permit(self, year, mileage):
        if year < 2016:
            return False
        if mileage > 15:
            return True
        return False


class BikePollutionPermit:
    def __init__(self):
        self.permit = True

    def check_permit(self, year, mileage):
        if year < 2010:
            self.permit = False
            return False
        if mileage < 40:
            if year > 2016:
                return True
            self.permit = False
            return False
        self.permit = True
        return True


class TractorPollutionPermit:
    def fetch_tractor(self, year, is_farmer):
        if year > 2015 and is_farmer:
            return True
        if year > 2017:
            return True
        return False


class TractorPesticides(TractorPollutionPermit):
    def fetch_pesticides_permit(self, pesticide_effect):
        if pesticide_effect < 10:
            if self.fetch_tractor(2019, True):
                return True
            return False
        car_pollution_permit = CarPollutionPermit()
        return (car_pollution_permit.check_permit(2019, 16))

如您所见,TractorPesticides 类依赖于 CarPollutionPermit。我必须提取这种关系。 代码库是 Python3 的,我执行此功能的代码也在 Python3 中。

最佳答案

您需要使用 abstract syntax tree你的模块。至少适用于您的模块并显示 TractorPesticides 依赖于 CarPollutionPermit 的示例:

import ast


with open('test.py') as f:
    data = f.read()
    module = ast.parse(data)
    classes = [
        obj
        for obj in module.body
        if isinstance(obj, ast.ClassDef)
    ]
    class_names = [obj.name for obj in classes]
    dependencies = {name: [] for name in class_names}
    for cls in classes:
        for node in ast.walk(cls):
            if isinstance(node, ast.Call):
                if isinstance(node.func, ast.Name):
                    if node.func.id != cls.name and node.func.id in class_names:
                        dependencies[cls.name].append(node.func.id)
    for class_name, dependency in dependencies.items():
        print(class_name, dependency)

输出:

CarPollutionPermit []
BikePollutionPermit []
TractorPollutionPermit []
TractorPesticides ['CarPollutionPermit']

关于python - 如何检查一个类是否已在同一模块中的另一个类中使用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58489042/

相关文章:

python - 如何从列表中提取某些项目?

c++ - 在类中创建 vector 的 vector (二维数组)- 错误 :C++ requires a type specifier for all declarations

python - 垂直打印字符串列表

python - 无法使用 pip 安装 lxml

python - "http.client.CannotSendRequest: Request-sent"错误

C++继承,将成员添加到派生类并重新定义构造函数

java - 从通用类创建新的特定对象

python - 转换具有多个字典外观的字符串

python - 标记化单词列表

Python 查询处理和 bool 搜索