在 Python 中使用 super() 干燥 [重复]

Posted

技术标签:

【中文标题】在 Python 中使用 super() 干燥 [重复]【英文标题】:DRY with super() in Python [duplicate] 【发布时间】:2021-09-15 21:45:00 【问题描述】:

抱歉,如果这是一个愚蠢的问题,但我无法通过搜索找到它。我有以下 Python 代码:

class CustomListView(ListView):
    def dispatch(self, request : HttpRequest, *args, **kwargs):
        # ... long blurb doing something with request and super, e.g.
        return super().dispatch(request, *args, **kwargs)
class CustomDetailView(DetailView):
    def dispatch(self, request : HttpRequest, *args, **kwargs):
        # ... long blurb doing something with request and super, e.g.
        return super().dispatch(request, *args, **kwargs)

(这是在 Django 的上下文中,但我认为这无关紧要。)

这两个dispatch函数完全一样,所以我觉得这是公然违反DRY原则。但问题是因为使用了super(),假设super 被调用了很多次,我不知道如何只编写一次这个函数并解决继承问题。

解决这个问题的最佳方法是什么?

【问题讨论】:

你有tried mixins? 这个other SO post 包含关于mixin 的深入讨论。 这并不像看起来那么简单。 编译器 根据调用位置确定将哪些参数传递给super。您可能需要注意基类出现的顺序,以确保调用正确的dispatch 方法。 另外,如果同一继承层次结构中的两个类想要使用如下所示的dispatch 方法,那么mixin 将无法工作。将此方法放入 mixin 和直接放入 CustomListViewCustomDetailView 之间有很多区别。我会避免为此使用 mixin。 【参考方案1】:

只是为了将其标记为已解决,我正在寻找的相关关键字是 mixins。 cmets 中有几个链接,一个指向past SO answer,一个指向Django mixins specifically。谢谢大家。

【讨论】:

以上是关于在 Python 中使用 super() 干燥 [重复]的主要内容,如果未能解决你的问题,请参考以下文章

让 Grails 控制器更干燥?

python中super的使用

python中super()的一些用法

为啥允许在 Python 中使用 super 从 __init__ 返回一个值?

python中super的用法实例解析

论文电坐便器暖风干燥性能测试方法的研究(上)