Python中如何调用类所有实例(含继承关系实例)的同名方法
实现方案
Python本身没有内置调用类所有实例同名方法的语法,你可以通过以下两种常用方式实现需求:
方案1:类内部维护实例注册表(无感知自动注册)
在父类中定义类属性存储所有子类实例,实例初始化时自动注册到列表中,同时子类的process方法优先调用父类实现,即可通过单次调用触发所有实例执行对应逻辑:
class Parent: # 类级别的实例注册表 _instances = [] def __init__(self): # 实例初始化时自动注册 self._instances.append(self) def process(self): print("Parent process") # 批量触发所有注册实例的process方法 @classmethod def process_all(cls): for instance in cls._instances: instance.process() # 如果你需要调用任意实例的process就触发所有,打开下方注释即可 # def process(self): # self.process_all() class ChildType1(Parent): def __init__(self): super().__init__() def process(self): # 优先调用父类process实现 super().process() print("ChildType1 process") class ChildType2(Parent): def __init__(self): super().__init__() def process(self): super().process() print("ChildType2 process") c = ChildType1() d = ChildType1() e = ChildType2() # 单次调用即可得到你需要的输出 Parent.process_all()
执行后输出为:
Parent process ChildType1 process Parent process ChildType1 process Parent process ChildType2 process
注意:该方案需要在实例销毁时手动将其从
_instances列表中移除,否则会出现内存泄漏,未被引用的实例无法被GC回收。
方案2:手动维护实例数组(零侵入更灵活)
也就是你提到的类实例数组方案,不需要修改原有类的实现逻辑,自己维护存储所有实例的列表即可:
# 原有类仅需在子类process中添加父类调用 class Parent: def __init__(self): pass def process(self): print("Parent process") class ChildType1(Parent): def __init__(self): super().__init__() def process(self): super().process() print("ChildType1 process") class ChildType2(Parent): def __init__(self): super().__init__() def process(self): super().process() print("ChildType2 process") c = ChildType1() d = ChildType1() e = ChildType2() # 手动维护所有实例的列表 all_instances = [c, d, e] # 单次遍历调用即可 for ins in all_instances: ins.process()
输出和方案1完全一致,该方案适合实例创建逻辑集中的场景,灵活度更高。
内容的提问来源于stack exchange,提问作者rcallist
相关产品推荐
相关产品推荐

