2016-06-16 11 views
0

私はPythonクラスに新しく、継承の概念を理解しようとしています。私はMathというクラスを持っていて、これはCalcから継承しています。私は下になく、限りエラーを取得していたコードを実行すると親クラスのメソッドの呼び出しに関する問題

class Calc(object): 
    def mul(a, b): 
     return a * b 

class Math(Calc): 
    def product(self, a, b): 
     return super(Math, self).mul(a, b) 

if __name__ == "__main__": 
    m = Math() 
    print "Product:", m.product(1.3, 4.6) 

は私が内だけmul()のため2つの引数に合格している伝えることができます:Math.product()から私は以下のように、基本クラスのメソッドmul()を起動しようとしていますMath.product(a,b)。誰かが私が作ったミスについての光を放つことができますか?

Product: 
Traceback (most recent call last): 
File "inheritance.py", line 14, in <module> 
print "Product:", m.product(1.3, 4.6) 
File "inheritance.py", line 9, in product 
return super(Math, self).mul(a, b) 
TypeError: mul() takes exactly 2 arguments (3 given) 
+3

これはクラスに入れる必要はなく、 'from operator import mul'だけで済みます。 – jonrsharpe

答えて

8

あなたが

class Calc(object): 
    def mul(a, b): 
     return a * b 

にパラメータとしてselfが含まれること、またはstaticmethodデコレータを使用する必要があります。例えば

:あなたはsuper(Math, self).mul(a, b)を呼び出すとき

class Calc(object): 
    @staticmethod 
    def mul(a, b): 
     return a * b 

は今それがため、self, a, bに次の引数に渡します。クラスのメソッド(ドットメソッド)を呼び出すたびに、暗黙のうちに最初のパラメータとしてselfが渡されます。

staticmethodデコレータは、クラスの特定のインスタンスで機能しないため、selfを渡す必要はありません。

+0

それはクールです..両方のソリューションは、魅力的なように働いていました。@staticmethodデコレータは、私が推測するのが最も好きな方法ですね。 –

+1

はい、関数が呼び出されているクラスのプロパティを使用していない場合、 'staticmethod'はそれを最も読みやすくします。 –

+0

私は答えとしてhtisが好きで、OPも同じです:Awsome! ...しかし、私は '' Calc'クラスの名前空間に接続されているか、または '' Calc''クラスの名前空間にフックされているメソッドが、それ以上編集されていないことを願っています。そうでなければ@jonrsharpeのコメントに行きます);-) – Dilettant

関連する問題