关于Python中super()调用父类方法的疑问与使用困惑
Python中super()在该代码场景的作用解析
核心问题解答
super().value_from_datadict()调用的是父类的普通实例方法
它和构造函数__init__无关,value_from_datadict是父类Select2TagWidget中定义的一个普通实例方法,作用是从请求数据字典里提取对应的值。为什么要用
super()而不是直接self.value_from_datadict()?- 因为子类
MyWidget已经**重写(覆盖)**了value_from_datadict方法。如果此时用self.value_from_datadict(),会递归调用子类自己的这个方法,直接陷入无限循环(当前方法里调用自己,永远出不去)。 super()的作用就是绕开子类的重写,明确调用父类版本的value_from_datadict方法,拿到父类处理后的原始值,再在子类里做二次加工(这里是把列表转成逗号分隔的字符串)。
- 因为子类
代码逻辑拆解
这段代码是典型的扩展父类方法功能的场景:
class MyWidget(Select2TagWidget): def value_from_datadict(self, data, files, name): # 调用父类方法获取原始处理结果(比如列表形式的选中标签) values = super().value_from_datadict(data, files, name) # 在父类结果基础上,加工成逗号分隔的字符串返回 return ",".join(values)
如果不用super(),直接写self.value_from_datadict(),程序会不断调用当前这个方法,最终触发栈溢出错误。
内容的提问来源于stack exchange,提问作者foxRun28
相关产品推荐
相关产品推荐

