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

2024-10-02 04:36:05 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个模块,它有多个类。一个类,比如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的。你知道吗


Tags: 模块selffalsetruereturnifinitdef
1条回答
网友
1楼 · 发布于 2024-10-02 04:36:05

您需要使用模块的^{}。至少适用于您的模块并显示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']

相关问题 更多 >

    热门问题