我有一个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.我该怎么做?
我尝试将以下构造函数分别添加到m
和MyClass2
,但是当我尝试创建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
答案 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__
(提供自己的构造函数),那么构造函数应该具有相同的签名,因为框架将调用构造函数。