web-dev-qa-db-ja.com

python-異なる方法でクラスから関数を呼び出す

EDIT2:あなたの助けをありがとう!編集:@staticmethodを追加すると機能します。しかし、なぜここでタイプエラーが発生するのか、まだ疑問に思っています。

私はOOPSを始めたばかりで、まったく新しいものです。クラスから関数を呼び出すさまざまな方法について、非常に基本的な質問があります。コードを含むtestClass.pyファイルがあります。

class MathsOperations:
    def __init__ (self, x, y):
        self.a = x
        self.b = y
    def testAddition (self):
        return (self.a + self.b)

    def testMultiplication (self):
        return (self.a * self.b)

次のコードでmain.pyという別のファイルからこのクラスを呼び出しています。

from testClass import MathsOperations

xyz = MathsOperations(2, 3)
print xyz.testAddition()

これは問題なく動作します。しかし、私はクラスをもっと簡単な方法で使用したいと思いました。

次のコードをtestClass.pyファイルに追加しました。今回はinit関数を落としました。

class MathsOperations:
    def testAddition (x, y):
        return x + y

    def testMultiplication (a, b):
        return a * b

これを使用して呼び出す;

from testClass import MathsOperations
xyz = MathsOperations()
print xyz.testAddition(2, 3)

これは機能しません。誰かがケース2で何が間違って起こっているのか説明できますか?このクラスはどのように使用しますか?

私が得るエラーは、「TypeError:testAddition()は正確に2つの引数を取ります(3つが指定されています)」です。

9
Rishav Sharan

メソッドの最初のパラメータとして自分自身を使用する必要があります

2番目のケースでは、使用する必要があります

class MathOperations:
    def testAddition (self,x, y):
        return x + y

    def testMultiplication (self,a, b):
        return a * b

あなたのコードでは次のことができます

tmp = MathOperations
print tmp.testAddition(2,3)

最初に変数をインスタンス化せずにクラスを使用する場合

print MathOperation.testAddtion(2,3)

「TypeError:unbound method」というエラーが表示されます

あなたがそれをしたいなら、あなたは @staticmethod デコレータ

例えば:

class MathsOperations:
    @staticmethod
    def testAddition (x, y):
        return x + y

    @staticmethod
    def testMultiplication (a, b):
        return a * b

あなたのコードであなたは使うことができます

print MathsOperations.testAddition(2,3)
18
Rafael Rotelok

免責事項:これは正解への答えではなく、たとえ参考文献で答えが見つかる場合でも、アドバイスのようなものです

IMHO:Pythonでのオブジェクト指向プログラミングは、かなりひどいです。

メソッドのディスパッチは簡単ではありません。バインドされた/バインドされていないインスタンス/クラス(および静的!)メソッドについて知っておく必要があります。複数の継承が可能であり、レガシーおよび新しいスタイルクラス(あなたは古いスタイルでした)を処理し、MROがどのように機能するか、プロパティを知っている必要があります...

簡単に言えば、あまりにも複雑で、内部では多くのことが起こっています。同じことを達成するための多くの異なる方法があるので、私はさらに言って、それはunpythonicです。

私のアドバイス:OOPは、本当に役立つ場合にのみ使用してください。通常、これは、よく知られたプロトコルを実装し、システムの他の部分とシームレスに統合するクラスを作成することを意味します。目的のためだけに多くのクラスを作成しないでくださいオブジェクト指向のコードを書くことの。

このページをよくお読みください。

それらは非常に便利です。

本当にOOPを学びたいのであれば、Javaのようなより一般的な言語から始めることをお勧めします。 Pythonの半分ほど楽しくはありませんが、より予測可能です。

9
fortran

メソッドはオブジェクト(つまり、自己)を参照しないため、 @ staticmethod decorator を使用する必要があります。

class MathsOperations:
    @staticmethod
    def testAddition (x, y):
        return x + y

    @staticmethod
    def testMultiplication (a, b):
        return a * b
2
Owen
class MathsOperations:
    def __init__ (self, x, y):
        self.a = x
        self.b = y
    def testAddition (self):
        return (self.a + self.b)

    def testMultiplication (self):
        return (self.a * self.b)

その後

temp = MathsOperations()
print(temp.testAddition())
1
Ali Hajiloo

メソッドを使用するには、クラスのインスタンスが必要です。または、クラスの変数(静的パラメーターではない)にアクセスする必要がない場合は、メソッドを静的として定義し、クラスがインスタンス化されていなくても使用できます。メソッドに@staticmethodデコレータを追加するだけです。

class MathsOperations:
    @staticmethod
    def testAddition (x, y):
        return x + y
    @staticmethod
    def testMultiplication (a, b):
        return a * b

docs: http://docs.python.org/library/functions.html#staticmethod

1
rplnt