如何在Python中执行此类继承?

时间:2016-09-21 06:38:47

标签: python inheritance tornado

我有一个Python / Tornado应用程序,它使用以下3个类来响应HTTP请求:

_diffs

我希望所有实例import tornado.web class MyClass1(tornado.web.RequestHandler): x = 1 y = 2 def my_method1(self): print "Hello World" class MyClass2(MyClass1): @tornado.web.authenticated def get(self): #Do Something 1 pass @tornado.web.authenticated def post(self): #Do Something 2 pass class MyClass3(MyClass2): pass 都将实例变量MyClass2设置为整数3.但是m的任何实例都应该覆盖它并且MyClass3设置为整数4.我该怎么做?

我尝试将以下构造函数分别添加到mMyClass2,但是当我尝试创建MyClass3的实例时,我收到以下错误:MyClass3

MyClass2的初始化(适用):

TypeError: __init__() takes exactly 1 argument (3 given)

MyClass3的初始化(适用):

def __init__(self):
    self.m = 3 # This value will be overridden by a subclass

2 个答案:

答案 0 :(得分:4)

tornado.web.RequestHandler已经有__init__方法,而Tornado希望它采用两个参数(加上绑定方法的self参数)。您重写的版本不会使用这些。

更新您的__init__方法以获取任意额外参数并通过super()传递这些参数:

class MyClass2(MyClass1):
    def __init__(self, *args, **kwargs):
        super(MyClass2, self).__init__(*args, **kwargs)
        self.m = 3

    @tornado.web.authenticated
    def get(self):
        #Do Something 1
        pass

    @tornado.web.authenticated
    def post(self):
        #Do Something 2
        pass


class MyClass3(MyClass2):
    def __init__(self, *args, **kwargs):
        super(MyClass3, self).__init__(*args, **kwargs)
        self.m = 4

您还可以使用RequestHandler.initialize() method设置每个请求的实例变量;您可能必须再次使用super()将调用传递给父类,如果您的父类initialize()执行更多工作而不仅仅是设置self.m

答案 1 :(得分:0)

ReequestHandler的{​​{3}}:

class RequestHandler(object):
    ...
    def __init__(self, application, request, **kwargs):
        ...

当您继承RequestHandler时,您可以:

a)不要覆盖__init__(即不提供自己的构造函数) 要么 b)如果重写__init__(提供自己的构造函数),那么构造函数应该具有相同的签名,因为框架将调用构造函数。