如何通过类或实例在线程数组中查找目标线程?现有判断逻辑失效
解决线程数组匹配问题
原代码问题分析
- 重复判断:
isinstance(thread, type(instance))与isinstance(thread, instance.__class__)逻辑完全一致,属于冗余代码 - 无效判断:
thread == type(instance)是将线程对象与类对象直接比较,永远不会返回True - 逻辑覆盖不全:没有区分「传入类」和「传入实例」两种场景的不同匹配规则
修正后的实现
下面的代码支持两种匹配模式:
- 传入类:查找数组中属于该类(或其子类)的线程实例
- 传入实例:查找数组中与该实例完全相同的线程对象
def exist_target_thread(target): # 判断传入的是类还是实例 target_is_class = isinstance(target, type) for thread in gv.self_observer_threads.threads: if target_is_class: # 传入类时,匹配该类或其子类的实例 if isinstance(thread, target): return True else: # 传入实例时,匹配同一个对象引用 if thread is target: return True return False
使用示例
# 示例1:传入类,查找对应类的线程 if exist_target_thread(MyThreadClass): print("找到对应类的线程") # 示例2:传入实例,查找对应实例线程 my_thread_instance = MyThreadClass() if exist_target_thread(my_thread_instance): print("找到对应实例的线程")
关键说明
- 用
isinstance(target, type)区分类和实例:所有类都是type的实例,以此判断参数类型 - 匹配实例优先用
is:确保是同一个对象引用,若业务允许值相等也匹配,可替换为== - 匹配类用
isinstance:支持子类实例匹配,若需精确匹配父类,改用type(thread) == target
内容的提问来源于stack exchange,提问作者user2447290
相关产品推荐
相关产品推荐

