python中的super()方法解析

2024-09-28 23:53:39 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在为django创建两个自定义小部件来使用所选jQuery插件,一个用于ForeignKey模型字段,另一个用于ManyToManyField。因此,我分别覆盖forms.Selectforms.SelectMultiple。我将公共功能放在公共父类中,如下所示:

class ChosenWidgetParent(object):
    class Media:
        css = {
            'all': (
                'sub/staticfull/css/plugins/chosen/chosen.css',
            )
        }
        js = (
            'sub/staticfull/js/jquery-2.1.1.js',
            'sub/staticfull/js/plugins/chosen/chosen.jquery.js',
        )
    def render(self, name, value, attrs=None, **kwargs):
        attrs['chosen'] = 'chosen'
        rendered = super().render(name, value, attrs, **kwargs)
        return rendered + mark_safe(u'''
            <script>
                $(document).ready(function () {
                   $('#id_%(name)s').chosen({
                        disable_search_threshold: 10,
                   })
                })
            </script>''' % {'name': name})

注意有一个对super的调用,它应该分别引用SelectSelectMultiple的render方法。你知道吗

然后,我定义我的类:

class ChosenWidgetMultiple(widgets.SelectMultiple, ChosenWidgetParent):
    pass

class ChosenWidget(widgets.Select, ChosenWidgetParent):
    pass

不幸的是,这不起作用,但是当我交换父类时,它就起作用了。你知道吗

class ChosenWidgetMultiple(ChosenWidgetParent, widgets.SelectMultiple):
    pass

class ChosenWidget(ChosenWidgetParent, widgets.Select):
    pass

有人能解释一下为什么吗?你知道吗


Tags: namejsformspasswidgetsrenderselectcss
1条回答
网友
1楼 · 发布于 2024-09-28 23:53:39

因为这就是方法解析的工作方式。Python将按照类的声明顺序遍历这些类,并调用它找到的第一个方法。当您首先声明原始小部件时,Python将找到它的render方法并调用它;它永远不会继续执行您的实现。但是当你把你的放在第一位时,Python会调用它,然后当它到达super()时会调用原始的。你知道吗

相关问题 更多 >