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

Python2类中嵌套方法调用报错,如何调用utils内的reboot方法?

问题解答

你出错的核心原因是:a.utils获取到的是ROUTER类的实例方法对象,而非执行该方法后返回的包含reboot的命名空间/对象。

在Python中,类里定义的方法(比如你的utils),如果不加括号调用,得到的是函数本身,而不是方法执行后的结果。你在utils内部嵌套的update、reboot,只有在utils方法被执行时才会被定义,且它们的作用域仅限于utils方法内部,直接访问未调用的utils方法对象,自然找不到reboot属性。

两种解决办法:

1. 先调用utils方法,再访问reboot

把调用方式改成先执行utils,拿到它返回的结果(需确保utils返回包含内部方法的上下文对象),再调用reboot:

a = ROUTER()
# 先执行utils方法,获取内部嵌套方法所在的上下文
utils_context = a.utils()
utils_context.reboot()

# 或者简化成一行
a.utils().reboot()

如果你的utils方法原本没有返回值,需要修改utils方法,让它返回一个包含update和reboot的对象,比如自定义类实例:

class ROUTER(object):
    def utils(self):
        def update():
            print("update called")
        def reboot():
            print("reboot called")
        # 定义内部类承载嵌套方法
        class UtilsContext(object):
            pass
        ctx = UtilsContext()
        ctx.update = update
        ctx.reboot = reboot
        return ctx

2. 将utils改为嵌套类(而非方法)

如果希望保持a.utils.reboot()的调用风格,可以把utils从方法改成ROUTER的嵌套类,把update和reboot定义为嵌套类的静态方法:

class ROUTER(object):
    class utils:
        @staticmethod
        def update():
            print("update called")
        
        @staticmethod
        def reboot():
            print("reboot called")

这样a.utils会直接指向嵌套的utils类,你可以直接调用它的reboot静态方法,不需要先执行utils。

内容的提问来源于stack exchange,提问作者user12227081

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.25 13:19:01