【问题标题】:DRY with super() in Python [duplicate]在 Python 中使用 super() 干燥 [重复]
【发布时间】: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 被调用了很多次,我不知道如何只编写一次这个函数并解决继承问题。

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

【问题讨论】:

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

标签: python inheritance multiple-inheritance


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-08
    • 2012-01-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多