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堂课。顾名思义,我理解这个类的一个实例模型一个方程。由于这样一个方程的根是该方程的一个属性,我认为让该方法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 回答