Python:子类可以重载继承的方法吗?

发布于 2021-01-29 14:56:42

我正在Google App Engine中制作一个购物车应用。我有许多从基本处理程序派生的类:

class BaseHandler(webapp.RequestHandler):
    def get(self, CSIN=None):
        self.body(CSIN)

这是否意味着body()每个后代类的方法都需要具有相同的参数?这很麻烦。实际上只有一个后代使用该参数。而当我添加新的参数时呢?我需要遍历每堂课吗?

class Detail(BaseHandler):
    def body(self, CSIN):

class MainPage(BaseHandler):
    def body(self, CSIN=None): #@UnusedVariable

class Cart(BaseHandler):
    def body(self, CSIN): #@UnusedVariable
关注者
0
被浏览
80
1 个回答
  • 面试哥
    面试哥 2021-01-29
    为面试而生,有面试问题,就找面试哥。

    重写的方法原则上不必彼此具有相同的参数,但是它们必须具有与调用它们相同的形式参数。因此,由于任何处理程序都可以通过body调用它get,是的,它们必须相同。就此而言,重写的重点是调用者不知道对象的确切类,因此,如果它们都不具有相同的参数,通常调用者将不知道传递什么。因此,我认为使用不同参数进行覆盖将是不寻常的棘手问题。

    如果更改了args,则使用yes,则必须更改要匹配的函数。这与继承无关,这就是Python函数的工作方式。

    如果您想要更多的灵活性,可以使用关键字参数,这是将字典作为参数传递的一种不错的方式:

    class Detail(BaseHandler):
        def body(self, **kwargs):
            print kwargs['CSIN']
    
    class MainPage(BaseHandler):
        def body(self, **kwargs): # can ignore kwargs
    
    class Cart(BaseHandler):
        def body(self, **kwargs): # can ignore kwargs
    
    class BaseHandler(webapp.RequestHandler):
        def get(self, CSIN=None):
            self.body(CSIN = CSIN, some_new_arg = 3)
    
    class SomeNewHandler(BaseHandler):
        def body(self, **kwargs):
            print kwargs['some_new_arg']
    

    不过,我对此确实有一点疑问:如果您要添加很多新参数,并且大多数实现都忽略了大多数参数,那么body这些参数可能并不是真正的功能。实际上,参数可能是处理程序对象状态的一部分,而您恰好只是将其作为参数传递。显然,差异在某种程度上是主观的-
    对于每个对象仅调用一次的函数,在传递字典和self用作字典之间并没有太多实际的区别。



知识点
面圈网VIP题库

面圈网VIP题库全新上线,海量真题题库资源。 90大类考试,超10万份考试真题开放下载啦

去下载看看