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

2024-06-28 14:50:20 发布

您现在位置:Python中文网/ 问答频道 /正文

我在谷歌应用程序引擎中制作购物车应用程序。我有许多从基本处理程序派生的类:

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

Tags: 引擎selfnone应用程序处理程序参数defbody
2条回答

Python只基于名称匹配重载方法。也就是说

class Base:
  def method(self, param2):
     print "cheeses"

class NotBase(Base):
  def method(self):
     print "dill"

obj = NotBase();
obj.method() 

将输出dill(而obj.method(“stuff”)将失败)。

然而,在你的情况下,这不是理想的行为。如果重载的body方法的参数少于基get方法中调用所需的参数,则在此类类上调用get方法将导致错误。

原则上,重写的方法不必具有彼此相同的参数,但它们必须具有调用它们时使用的相同形式参数。因此,由于任何处理程序都可以由get调用body,所以它们必须是相同的。对于这一点,重写的要点是调用方不知道对象的确切类,因此如果它们都没有相同的参数,通常调用方不知道传递什么。因此,我认为,使用不同参数进行覆盖是一种不寻常的伎俩。

如果您更改了它调用的参数,则必须更改函数以匹配。这与继承无关,而是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可能并不是这些参数的函数。实际上,这些参数可能是handler对象状态的一部分,您只是碰巧将其作为参数传递。显然,这种差异有些主观——对于每个对象只调用一次函数来说,传递字典和使用self作为字典之间并没有太大的实际差异。

相关问题 更多 >