在 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 和直接放入 CustomListView
或 CustomDetailView
之间有很多区别。我会避免为此使用 mixin。
【参考方案1】:
只是为了将其标记为已解决,我正在寻找的相关关键字是 mixins。 cmets 中有几个链接,一个指向past SO answer,一个指向Django mixins specifically。谢谢大家。
【讨论】:
以上是关于在 Python 中使用 super() 干燥 [重复]的主要内容,如果未能解决你的问题,请参考以下文章