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

Python方法重写问题:如何在admin类中调用admin_base的test方法输出‘2’

问题分析

这是Python中**方法解析顺序(MRO)**导致的问题。先看一下admin类的MRO(可以通过print(admin.__mro__)查看):

(<class '__main__.admin'>, <class '__main__.user'>, <class '__main__.admin_base'>, <class '__main__.theme'>, <class '__main__.parent_model_admin'>, <class 'object'>)

你在admin.test()里写的super(admin_base, self).test(),作用是在当前实例的MRO链中,找到admin_base之后的第一个实现了test()方法的类。而admin_base之后的类是theme(没有test方法),再往后是parent_model_admin,所以最终调用的是parent_model_admin.test(),打印出"1"。

解决方案

有两种简单的方式可以实现调用admin_base.test()并打印"2":

方法1:直接调用admin_base类的方法

直接通过类名调用,同时传入当前实例self作为参数,绕过MRO查找,明确指定调用目标:

class admin(user, admin_base): 
    def test(self): 
        admin_base.test(self)  # 直接调用admin_base的test方法
        pass

方法2:利用super指定正确的MRO起点

在MRO链中,user之后的类就是admin_base,所以可以用super(user, self).test()来定位到admin_base的test方法:

class admin(user, admin_base): 
    def test(self): 
        super(user, self).test()  # 从user之后的类找test方法,也就是admin_base
        pass

这样super会在MRO中跳过user,直接调用下一个有test方法的类——admin_base,从而打印"2"。

验证

修改后运行代码:

hai = admin() 
hai.test()  # 输出:2

内容的提问来源于stack exchange,提问作者Mark Anthony Libres

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.30 13:12:42