如何在子类中使用exec执行父类函数?解决super()无参数报错问题
解决super()在exec/eval中调用父类方法的问题
嘿,我来帮你搞定这个报错!你遇到的RuntimeError: super(): no arguments,本质是因为exec执行的代码片段是个独立的“小环境”,它没办法自动拿到当前子类B和实例self的上下文信息——而无参数的super()完全依赖这些上下文才能找到对应的父类。
下面给你两种可行的解决办法:
方案1:给super()显式传参,同时注入上下文到exec环境
修改你的子类代码,把super()改成super(B, self),并且把当前的self和B传入exec的作用域里,这样动态执行的代码就能正确识别它们了:
class A(): def f1(self): print("hello") class B(A): def __init__(self, func): # 构造带显式参数的super调用字符串 self.function = f'super(B, self).{func}' print(self.function) # 把self和B注入到exec的局部作用域 exec(self.function, globals(), {'self': self, 'B': B}) b = B('f1()')
运行这段代码就能正常输出hello啦~
方案2:放弃exec,用反射更安全简洁
其实完全没必要用exec这种动态执行代码的方式,Python自带的反射机制就能更安全地实现你的需求,代码还更清爽:
class A(): def f1(self): print("hello") class B(A): def __init__(self, func_name): # 通过getattr直接获取父类的方法 parent_method = getattr(super(), func_name) # 调用拿到的方法 parent_method() b = B('f1')
这种方式不仅避开了exec可能带来的安全隐患(比如不小心传入恶意字符串),可读性也强很多,是更推荐的做法哦。
补个小解释:为什么原来的代码会报错?
无参数的super()是Python 3的语法糖,它会在类定义的作用域里自动“抓取”当前类和实例的信息。但exec运行的代码是在临时生成的作用域中,没有这个自动抓取的机制,所以必须显式给super()传入子类和实例参数,它才能正确找到父类的方法。
内容的提问来源于stack exchange,提问作者birdalugur
相关产品推荐
相关产品推荐

