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
相关产品推荐
相关产品推荐

