You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在子类中使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.14 08:38:06