我正在使用Google App Engine制作购物车应用。我有许多派生自基本处理程序的类:
class BaseHandler(webapp.RequestHandler):
def get(self, CSIN=None):
self.body(CSIN)
这是否意味着每个后代类的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
答案 0 :(得分:7)
重写方法原则上不必具有相同的参数,但它们必须具有相同的形式参数。因此,任何处理程序都可以通过body
调用它get
,是的,它们必须是相同的。就此而言,重写的一点是调用者不知道对象的确切类,因此如果它们都不具有相同的参数,通常调用者将不知道要传递什么。因此,我认为使用不同参数的覆盖将是一种不同寻常的诡计。
如果更改了args,则调用它然后是,您必须更改要匹配的函数。这与继承无关,它是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
作为字典之间没有太大的实际区别。
答案 1 :(得分:3)
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
方法将导致错误。