2010-12-20 26 views
1

私は、クラスの継承をあまり経験していません。私を助けて、以下のコードを見てください:Pythonクラス継承のメソッドがありませんか?

result = handle.submit(system, service, logRequest) 
AttributeError: 'NoneType' object has no attribute 'submit' 

をしかし、私はそれを変更した場合::それは方法を提出すると言う

class Handle(STAFHandle): 

    def __init__(self, HandleName): 
     handle = STAFHandle.__init__(self, HandleName) 
     self.initLogger(handle) 

    def initLogger(self, handle): 
     self.logger = Logging(handle, 'Test') 

handle = Handle('test') 
handle.logger.info('test') 

定義されていない

class Handle(STAFHandle): 
    def __init__(self, HandleName): 
     handle = STAFHandle.__init__(self, HandleName) 

    def initLogger(self, handle): 
     self.logger = Logging(handle, 'Test') 

handle = Handle('test') 
handle.initLogger(handle) 
handle.logger.info('test') 

それが動作します。なぜ違いがありますか?どうもありがとう!!

乾杯、 浙江

答えて

4

STAFHandle.__init__戻りNone。あなたはおそらくしたい:

class Handle(STAFHandle): 
    def __init__(self, handle_name): 
     super(Handle, self).__init__(handle_name) 
     self.initLogger() 

    def initLogger(self): 
     self.logger = Logging(self, 'Test') 

handle = Handle('test') 

__init__方法は、彼らの最初の引数のオブジェクトとして取ることを忘れないでください、とオブジェクトを変更します。したがって、super(Handle, self).__init__(handleName)を呼び出すと、新しいオブジェクトを返す代わりにselfのプロパティが変更されます。あなたの2つの例の違いは、への2回の呼び出しで変数handleが異なることを示していることです。

明示的なSTAFHandle.__init__コールをsuperプロキシに置き換えました。この場合は同等ですが、__init__を破棄せずにクラスの継承を変更できるようになりましたので、より柔軟に対応できます。

HandleNamehandle_nameに変更しました。これはPythonの規約に準拠しています(CamelCaseはクラスを参照しています)。

+0

ありがとうございます。実際に私はこの方法を最初に試みましたが、別のエラーが発生しました: TypeError:super()引数1はclassobjではなく型でなければなりません –

+0

@Zhe:あなたの基本クラスは "旧式"です。それは 'オブジェクト'から派生しません。新しいタイプの階層では、*すべてのクラスがそうするべきです。一度それを変更するとすべてがうまくいくはずです。 – katrielalex

関連する問題