2016-09-21 2 views
0

私は、次の3つのクラスを持つHTTP要求に応答のPython/Tornadoアプリケーション持っている:私はすべてのインスタンスをしたいと思いこれを行う方法Pythonでのクラス継承?

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しかしMyClass3のすべてのインスタンスにインスタンス変数mセットを持っているがそれを上書きしてmを整数4に設定してください。どうすればいいですか?

私はそれぞれMyClass2MyClass3に次のコンストラクタを追加してみましたが、私はMyClass3のインスタンスを作成しようとすると、その後、私は次のエラーを取得:TypeError: __init__() takes exactly 1 argument (3 given)

MyClass2を。 のinit():

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

MyClass3。 のinit():

def __init__(self): 
    self.m = 4 

答えて

4

tornado.web.RequestHandlerには既に__init__メソッドがあり、Tornadoは2つの引数(バインドされたメソッドの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を設定するよりも、が機能します。

0

ReequestHandlerさんconstructor takes arguments

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

あなたはどちらか、その後RequestHandlerを継承:

A)__init__を上書きしないでください(つまり、あなた自身を提供していません。コンストラクタ) または b)__init__(独自のコンストラクタを指定)をオーバーライドすると、yフレームワークがコンストラクタを呼び出すので、コンストラクタは同じシグネチャを持つ必要があります。