Django/Python:理解super在函数中的用法
我刚刚开始思考什么是Django/Python:理解super在函数中的用法,python,django,Python,Django,我刚刚开始思考什么是super,以及它是如何在Django中基于视图的类中实现的。我试图理解super在以下代码中是如何工作的。有人能帮我把它一块一块地分解一下吗 from django.views.generic.detail import DetailView from apps.app_name.models import Article class ArticleDetailView(DetailView): model = Article template_name
super
,以及它是如何在Django中基于视图的类中实现的。我试图理解super在以下代码中是如何工作的。有人能帮我把它一块一块地分解一下吗
from django.views.generic.detail import DetailView
from apps.app_name.models import Article
class ArticleDetailView(DetailView):
model = Article
template_name = 'article/show.html'
def get_context_data(self, **kwargs):
context = super(ArticleDetailView, self).get_context_data(**kwargs)
return context
正如目前编写的,该方法完全不起任何作用,可以删除 上下文数据方法直接委托给继承链中的下一个类。在这种情况下,它将意味着使用超类
DetailView.get\u context\u data
但是,如果articletailview
上不存在该方法,则无论如何都会发生这种情况。所以这样写是没有意义的,显式地传递给超类
所以,代码很奇怪-这能回答你的问题吗
例如,如果您确实想在子类中做一些不同的事情,那么实现这个方法是有意义的。例如:
def get_context_data(self, **kwargs):
context = super(ArticleDetailView, self).get_context_data(**kwargs)
context['new_key'] = 'some injected context from ArticleDetailView'
return context
然后我们使用DetailView
中的上下文数据,并在articletailview
中添加额外的上下文
使用super(ArticleDetailView,self)。获取上下文数据
而不是简单地使用DetailView。获取上下文数据
的原因很复杂,并且与方法解析顺序(MRO)有关。Raymond Hettinger对此做了详细解释
注意:在Python3中,super的实现被清理了一点,您不再需要
super(ArticleDetailView,self)
您可以使用super()
,谢天谢地 super方法将访问当前类并调用特定方法,在这种情况下:
super(ArticleDetailView, self) # Access to the current class
并执行特定的方法:
.get_context_data(**kwargs)
类中的.get\u context\u data()
方法返回传递给模板(.html
文件)的上下文。在本例中,您使用的是DetailView
,因此您有一些预定义的上下文,例如:object
或article
如果只重写.get\u context\u data()
,而不调用.super()
,如下所示:
def get_context_data(self, **kwargs):
my_context = {...}
return my_context
您将丢失DetailView
上下文中的预定义变量。但是如果你想在当前的DetailView
的上下文中添加一些新的变量(值),你需要原始的上下文,这就是super(articletailview,self)提供的。因此,您将以这种方式使用它:
def get_context_data(self, **kwargs):
context = super(ArticleDetailView, self).get_context_data(**kwargs)
context.update({'my_key': 'my_value'})
return context
现在,您可以在模板中使用自己的值,而不会丢失默认的DetailView
上下文值。其中哪一部分不清楚?它调用该方法的基类实现,所以在这种情况下,super
为我做的唯一事情就是抓取model
和template\u name
,这样我就可以在get\u context\u data
中使用它们了。get\u context\u data
方法返回您可以在模板中使用的值,在这种情况下,您正在覆盖get\u context\u data
,因此如果不想丢失默认的DetailView
上下文数据,则需要使用super
调用原始get\u context\u data
,然后向上下文添加新值并将其返回到模板。是的,您可以使用它来添加新值并在模板中使用它们。嘿,谢谢您的回复。正如您所提到的,超级方法可以访问当前类。那么“自我”和“超级”的区别是什么呢。在下一步中,当我们调用super(ArticleDetailView,self)时,它似乎有一个无限循环。请你再解释一下好吗?