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

Nic*_*ner 4 python oop google-app-engine refactoring overloading

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

class BaseHandler(webapp.RequestHandler):
    def get(self, CSIN=None):
        self.body(CSIN)
Run Code Online (Sandbox Code Playgroud)

这是否意味着body()每个后代类的方法需要具有相同的参数?这很麻烦.只有一个后代实际使用该参数.那么当我添加新的args时呢?我需要经历并改变每一堂课吗?

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

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

class Cart(BaseHandler):
    def body(self, CSIN): #@UnusedVariable
Run Code Online (Sandbox Code Playgroud)

Ste*_*sop 7

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

如果您更改了它的调用,则调用它然后是,您必须更改要匹配的函数.这与继承无关,它是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']
Run Code Online (Sandbox Code Playgroud)

我稍微质疑一下它的智慧:如果你要添加新参数很多,并且大多数实现都忽略了大多数参数,那么可能body实际上并不是这些参数的函数.也许实际上参数是处理程序对象状态的一部分,您恰好将其作为参数传递.显然,这种差异在某种程度上是主观的 - 对于每个对象只调用一次的函数,传递字典和使用字典之间没有很多实际区别self.


Ana*_*rin 5

Python 仅根据名称匹配重载方法。意思就是

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

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

obj = NotBase();
obj.method() 
Run Code Online (Sandbox Code Playgroud)

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

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