Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/332.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Django/Python:理解super在函数中的用法_Python_Django - Fatal编程技术网

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)时,它似乎有一个无限循环。请你再解释一下好吗?