Saq*_*Ali 0 python inheritance tornado
我有一个 Python/ Tornado应用程序,它使用以下 3 个类响应 HTTP 请求:
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
Run Code Online (Sandbox Code Playgroud)
我希望所有实例MyClass2的实例变量都m设置为整数 3。但是任何实例都MyClass3应该覆盖它并m设置为整数 4。我该怎么做?
我尝试将以下构造函数分别添加到MyClass2和MyClass3,但是当我尝试创建 的实例时MyClass3,出现以下错误:TypeError: __init__() takes exactly 1 argument (3 given)
我的课堂2。初始化():
def __init__(self):
self.m = 3 # This value will be overridden by a subclass
Run Code Online (Sandbox Code Playgroud)
我的课堂3。初始化():
def __init__(self):
self.m = 4
Run Code Online (Sandbox Code Playgroud)
在tornado.web.RequestHandler已经有一个__init__方法和龙卷风希望它有两个参数(加上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
Run Code Online (Sandbox Code Playgroud)
您还可以使用该RequestHandler.initialize()方法来设置每个请求的实例变量;您可能需要使用super()再通过在调用父类,如果你的父类initialize()做更多的不仅仅是一组工作self.m。