如何在Python中为函数提供另一个函数的值

时间:2013-07-29 09:48:19

标签: python

我有一个解决二次方程的函数:

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

如果需要,打印二次方程的答案。

如何从上面的函数中为此功能提供 答案 列表以进行打印?

6 个答案:

答案 0 :(得分: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

答案 1 :(得分:2)

简短的回答已经发布。使用instance variableself.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()

简而言之,实例变量(数据成员)只是一个变量,其生命周期与其“所有者”相同(在示例中,{{1}引用的对象})。


现在,长期而且稍微迂腐的答案:在设计时,你必须考虑它的responsibilities及其state。简单地说,你班级的目的是什么?对于各种或多或少的相关功能,它只是一个容器吗?在这种情况下,上述答案是完全可以接受的。但通常情况下,您必须更严格一些 - 至少为了提高代码的可理解性/可维护性。

这里有一个eq课程。通过它的名字,我理解了这个类一个方程的一个实例。由于这个等式的根是该等式的属性,我认为将方法QuadEq作为该类的方法是可以接受的。稍微改变一下,我会使用更通用的名称solve_quad_eq。为什么?因为这为不同的等式提供了相同的语义的未来类。另外,将结果都返回到实例变量中可能会让人感到困惑。你应该在这里做出选择。没有提到你的函数有时返回根的事实,其他时候根的数量(solve)。

现在,打印。我对这个问题更加怀疑。显示自身不是等式的“原生”属性。如果你这样做,你很快就会在你的方程类中处理与“方程式”完全无关的问题:如何在文件中写入?二进制还是文字?我应该使用哪种编码?如何处理I / O错误?等等...

所以,如果我是你,我会向separation of concern推进,只提供一个“访问者”方法来返回根目录 - 并从外部显示它们。由于这似乎很重要,我在这里保留了访问器和0方法之间的分离(对于某些类型的方程可能是计算密集型的)。仅将实例变量solve用作缓存(memoization

以下是一个完整的例子:

self.answer

请注意在程序中添加另一种方程式是多么容易...

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

答案 2 :(得分: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()

答案 3 :(得分: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

答案 4 :(得分: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

答案 5 :(得分: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()