1

二次方程式を解く関数があります。

class QuadEq(object):
    def __init__(self, a, b, c):
        self.a = a
        self.b = b
        self.c = c

    def solve_quad_eq(self):
        D = self.b**2-4*self.a*self.c
        if D >= 0:
            x1 = (-self.b-math.sqrt(D))/2*self.a
            x2 = (-self.b+math.sqrt(D))/2*self.a
            answer = [x1, x2]
            return answer
        else:
            return 0

そして、同じクラスに関数があります:

 def show_result(self):
    print answer

必要に応じて二次方程式の答えを表示します。

この関数に、その上の関数からの回答 リストを印刷するにはどうすればよいですか?

4

6 に答える 6

3

答えをクラスのメンバーにします。で参照しself.answerます。

class QuadEq(object):
    def __init__(self, a, b, c):
        self.a = a
        self.b = b
        self.c = c
        self.answer = []


    def solve_quad_eq(self):
        D = self.b**2-4*self.a*self.c
        if D >= 0:
            x1 = (-self.b-math.sqrt(D))/2*self.a
            x2 = (-self.b+math.sqrt(D))/2*self.a
            self.answer = [x1, x2]
            return self.answer
        else:
            return 0

    def show_result(self):
        print self.answer
于 2013-07-29T09:51:34.947 に答える
2

短い答えはすでに投稿されています。インスタンス変数( self.answer)を使用します。

class QuadEq(object):
    def __init__(self, a, b, c):
        self.a = a
        self.b = b
        self.c = c

    def solve_quad_eq(self):
        self.answer = ("this", "that")
        return self.answer

    def show_result(self):
        print self.answer


eq = QuadEq(1,2,3)

eq.solve_quad_eq()
eq.show_result()

大まかに言えば、インスタンス変数 (データ メンバー) は、その「所有者」 (この例では、 によって参照されるオブジェクト) の寿命と同じ寿命を持つ単なる変数ですeq


ここで、長い (そしてもう少し専門的な) 答えについて説明します。クラスを設計するときは、クラスの責任状態について考える必要があります。簡単に言えば、あなたのクラスの目的は何ですか? 多かれ少なかれ関連するさまざまな機能の単なるコンテナですか?その場合、上記の答えは完全に受け入れられます。しかし、通常は、もう少し厳密にする必要があります。少なくとも、コードの理解可能性/保守性を向上させるためには。

ここにQuadEqクラスがあります。その名前から、このクラスのインスタンスが1 つの方程式をモデル化していることがわかります。そのような方程式の根はその方程式のプロパティsolve_quad_eqなので、メソッドをそのクラスのメソッドにすることは許容できると思います。わずかな変更により、より一般的な名前を使用しますsolve。なんで?それは、同じセマンティックを提供するさまざまな方程式の将来のクラスを提供するためです。さらに、結果返すこととインスタンス変数に格納することの両方が混乱を招く可能性があります。ここで選択する必要があります。あなたの関数が根を返すこともあれば、根の数を返すこともあるという事実は言うまでもありません(0)。

さて、印刷。私はこれについてもっと懐疑的です。表示自体は、方程式の「ネイティブ」プロパティではありません。そして、そのようにすれば、すぐに「方程式」とはまったく関係のない問題を方程式クラスで処理する必要があります。ファイルに書き込む方法は? バイナリまたはテキスト? どのエンコーディングを使用すればよいですか? I/O エラーに対処するには? 等々...

したがって、もし私があなたなら、関心の分離を推進し、ルートを返すための「アクセサ」メソッドだけを提供し、それらを外部から表示します。これは重要なように思われるので、ここではアクセサとsolveメソッドを分離しておきます (ある種の方程式では計算量が多くなる可能性があります)。インスタンス変数self.answerを単にキャッシュとして使用する ( memoization )

完全な例を次に示します。

class Eq(object):
    def __init__(self):
        self.answer = None # this should be calles "roots", no?

    def roots(self):
        if self.answer is None:
            self.solve()

        return self.answer

class QuadEq(Eq):
    def __init__(self, a, b, c):
        Eq.__init__(self)

        self.a = a
        self.b = b
        self.c = c

    def solve(self):
        self.answer = ("this", "that")
        return 2

eq = QuadEq(1,2,3)
print(eq.roots())

プログラムで解く別の種類の方程式を簡単に追加できるようになったことに注目してください...

class OtherEq(Eq):
    def __init__(self, a, b, c):
        Eq.__init__(self)

        self.a = a
        self.b = b
        self.c = c

    def solve(self):
        self.answer = ( "it", )
        return 1

...そしてさらに重要なことに、その新しい種類の方程式を使用するコードは、前のものとほとんど同じです。

eq = OtherEq(1,2,3)
print(eq.roots())
于 2013-07-29T11:01:56.660 に答える
1

オブジェクト自体に保存します。

class QuadEq(object):
    def __init__(self, a, b, c):
        self.a = a
        self.b = b
        self.c = c
        self.solution = None

    def solve_quad_eq(self):
        if self.solution is None:
            D = self.b**2-4*self.a*self.c
            if D >= 0:
                x1 = (-self.b-math.sqrt(D))/2*self.a
                x2 = (-self.b+math.sqrt(D))/2*self.a
                self.solution = [x1, x2]
            else:
                self.solution = 0
        return self.solution

    def show_result(self): # <--- just an alias to solve_quad_eq
        return self.solve_quad_eq()
于 2013-07-29T09:51:57.823 に答える
1

関数が間違った順序で実行されると、例外がスローされる可能性があります。

class QuadEq(object):
def __init__(self, a, b, c):
    self.answer = None

    #Rest of program...

def show_result(self):
    if self.answer is None:
        raise RuntimeError('Error in QuadEq, tried to print result before solving equation')
    print self.answer
于 2013-07-29T10:41:46.823 に答える
0

answerメンバー変数として保持します。

def solve_quad_eq(self):
    D = self.b**2-4*self.a*self.c
    if D >= 0:
        x1 = (-self.b-math.sqrt(D))/2*self.a
        x2 = (-self.b+math.sqrt(D))/2*self.a
        self.answer = [x1, x2]
        return self.answer
    else:
        return 0

def show_result(self):
    print self.answer
于 2013-07-29T09:52:11.090 に答える
0

あなたは本当にできません。このようにクラスのメンバーに答えさせない限り

class QuadEq(object):
    def __init__(self, a, b, c):
        self.a = a
        self.b = b
        self.c = c

    def solve_quad_eq(self):
        D = self.b**2-4*self.a*self.c
        if D >= 0:
            x1 = (-self.b-math.sqrt(D))/2*self.a
            x2 = (-self.b+math.sqrt(D))/2*self.a
            answer = [x1, x2]
            return answer
        else:
            return 0

    def show_result(self):
        if self.answer is None:
            self.answer =  solve_quad_eq()
        print self.answer

または、このような簡単なことをしてください...

def show_result(self):
    print self.solve_quad_eq()
于 2013-07-29T09:52:20.763 に答える