在Django类视图(CBV)中使用super()与super(类视图名,self)的差异
Django CBV中两种super()写法的差异解析
嘿,这个问题问到点子上了!其实这两种写法本质是Python版本迭代带来的不同语法,在现代Django项目(Python 3环境)里功能完全一致,但背后有个小历史背景:
不带参数的
super()是Python 3的语法糖
从Python 3开始,super()可以自动推断当前定义方法的类和实例,所以super().get_context_data(**kwargs)完全等价于你显式写出类名的super(ClassViewName, self).get_context_data(**kwargs)。它会自动找到当前类的直接父类,并调用对应的get_context_data方法,写法更简洁,也是现在推荐的风格。带参数的写法是Python 2的遗留习惯
在Python 2时代,super()必须显式传入类名和实例才能正确工作,所以当时的Django开发者都会写super(ClassViewName, self)...。后来Django从2.0版本开始就彻底放弃了Python 2支持,所以这种写法现在更多是老代码的延续,或者开发者保留了旧的编程习惯。
额外补充:哪怕你的CBV涉及多重继承,这两种写法的行为也完全一致——因为super()自动推断的类就是你当前写方法的那个ClassViewName,和显式传入的参数没有区别。
总的来说,选哪种都没问题,但更推荐用super().get_context_data(**kwargs),符合Python 3的现代语法,代码也更简洁。
内容的提问来源于stack exchange,提问作者Mohamed Benkedadra
相关产品推荐
相关产品推荐

