Python中如何用工厂模式同时触发同签名不同实现的函数?
解决方案
先修正你代码里的语法错误(比如@abstactmethod拼写错误,抽象类需继承ABC),再通过让工厂类统一管理所有子类实例的方式,实现单次调用触发多个子类方法执行的需求:
from abc import ABC, abstractmethod class Factory(ABC): @abstractmethod def func1(self, param1): pass # 类方法:获取所有子类的实例 @classmethod def get_all_subclass_instances(cls): return [subclass() for subclass in cls.__subclasses__()] # 类方法:批量调用所有子类的func1,生成预期格式输出 @classmethod def batch_call_func1(cls, param1): output_parts = [] for instance in cls.get_all_subclass_instances(): output_parts.append(instance.func1(param1)) print(' '.join(output_parts)) class A(Factory): def func1(self, param1): return f"{param1} class A" def func_A(self): print("Func A") class B(Factory): def func1(self, param1): return f"{param1} class B" def func_B(self): print("Func B") # 单次调用实现需求 Factory.batch_call_func1("param1") # 输出:param1 class A param1 class B
关键说明:
- 将原代码中
print改为返回字符串,方便拼接成你需要的连续输出格式;如果坚持保留print,可以让子类func1直接打印,同时用end=' '控制输出不换行,batch_call_func1只需遍历调用即可。 Factory.__subclasses__()会自动获取所有直接继承自Factory的子类,后续新增子类(比如C类)时,无需修改批量调用逻辑,自动支持扩展。- 通过类方法
batch_call_func1提供统一调用入口,完全符合你“通过Factory接口单次调用触发多子类方法”的要求。
如果不想修改子类func1的实现逻辑,可改用以下版本:
from abc import ABC, abstractmethod class Factory(ABC): @abstractmethod def func1(self, param1): pass @classmethod def batch_call_func1(cls, param1): for subclass in cls.__subclasses__(): subclass().func1(param1) class A(Factory): def func1(self, param1): print(param1 + " class A", end=' ') def func_A(self): print("Func A") class B(Factory): def func1(self, param1): print(param1 + " class B", end=' ') def func_B(self): print("Func B") Factory.batch_call_func1("param1") # 输出:param1 class A param1 class B
补充说明:
这个实现本质是工厂模式结合迭代器思想,通过工厂类统一管理所有子类实例,对外提供单一调用入口,避免手动逐个实例化子类并调用方法的繁琐操作。
内容的提问来源于stack exchange,提问作者Rishabh Das
相关产品推荐
相关产品推荐

