这是重写方法的一种好方法吗?

时间:2019-03-07 09:55:18

标签: python

class A():

    def foo(self):
        return "foo A"

    def foo1(self):
        return self.foo()

class B(A):

    b = 0

    def foo(self):
        self.b = 1
        return "foo B"

    def foo1(self):
        super(B, self).foo1()
        return True

B调用foo1,这将调用类A的{​​{1}},后者调用类foo1的{​​{1}},不是单向覆盖,这样做的利弊是什么?还是一个好习惯,这里潜在的问题是什么?

1 个答案:

答案 0 :(得分:0)

使用此模式是非常好的做法,并且很常见。

例如,我可以提到Django框架,因为我对此很熟悉。在该框架中,您可以对内置类进行子类化(例如,用于处理HTTP POST数据的通用UpdateForm)。 例如,UpdateView在其所有基类的某个位置具有以下两种方法(请注意一种方法如何调用另一种方法):

class UpdateView(...):
    def get_form_class(self):
        return self.form_class

    def get_form(self, form_class=None):
        if form_class is None:
            form_class = self.get_form_class()
        return form_class(**self.get_form_kwargs())

我可以创建自己的视图,从此内置视图中继承子类,并仅覆盖这些方法之一,而另一个则保持其原始功能。

from django.views.generic import UpdateView
from .forms import MyCustomFormClass

class MyUpdateView(UpdateView):
    def get_form_class(self):
        return MyCustomFormClass

这是一种非常常见的模式,它允许自定义,同时还避免了很多代码重复。

这能回答您的部分问题吗?