Python如何判断变量是否为指定外层类的内部类的实例
实现思路
Python 类的 __qualname__ 属性会存储类在定义结构中的完整层级路径,嵌套类的路径会通过点号拼接上层类的名称,我们可以通过比对类路径前缀,结合模块校验实现需求,核心逻辑如下:
- 排除对象本身就是目标类直接实例的场景
- 校验两个类属于同一模块,避免不同模块同名类误判
- 拆分两者的层级路径,判断对象类的路径前缀是否完全匹配目标类的路径,且长度更长(说明是嵌套在内部的类)
代码实现
def check_if_class_parent(obj, class_type): # 获取对象对应的类 obj_cls = type(obj) # 排除对象为目标类直接实例的情况 if isinstance(obj, class_type): return False # 校验两个类属于同一模块,避免同名类误判 if obj_cls.__module__ != class_type.__module__: return False # 拆分层级路径 obj_path = obj_cls.__qualname__.split('.') target_path = class_type.__qualname__.split('.') # 对象类路径长度不大于目标类的话,不可能是其内部嵌套类 if len(obj_path) <= len(target_path): return False # 比对前缀是否完全匹配 return obj_path[:len(target_path)] == target_path
测试验证
用你给出的示例代码测试:
class A: class B: def __init__(self): pass class C: def __init__(self): pass var = A.B.C() var_two = A.B() B = A.B C = A.B.C print(check_if_class_parent(var, A)) # 输出 True print(check_if_class_parent(var, B)) # 输出 True print(check_if_class_parent(var_two, A)) # 输出 True print(check_if_class_parent(var, C)) # 输出 False
运行结果完全符合你给出的预期。
内容的提问来源于stack exchange,提问作者TNTzx
相关产品推荐
相关产品推荐

