首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在Python中从另一个函数中为一个函数赋值

如何在Python中从另一个函数中为一个函数赋值
EN

Stack Overflow用户
提问于 2013-07-29 09:48:19
回答 6查看 373关注 0票数 1

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

代码语言:javascript
复制
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

然后在同一堂课中,我有一个函数:

代码语言:javascript
复制
 def show_result(self):
    print answer

如果我们需要的话,可以打印出二次方程的答案。

我如何从上面的函数中给出这个函数的应答列表来打印?

EN

回答 6

Stack Overflow用户

回答已采纳

发布于 2013-07-29 11:01:56

简短的答复已经张贴了。使用实例变量 (self.answer):

代码语言:javascript
复制
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)。

现在印刷。我对这件事比较怀疑。显示本身并不是方程的“本机”属性。如果你这样做,你很快就必须在你的方程类(Es)中处理与“方程”完全无关的问题:如何在文件中写入?二进制还是文本?我应该使用哪种编码?如何处理I/O错误?等等..。

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

下面是一个完整的例子:

代码语言:javascript
复制
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())

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

代码语言:javascript
复制
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

..。更重要的是,使用这种新方程的代码几乎与前一个相同:

代码语言:javascript
复制
eq = OtherEq(1,2,3)
print(eq.roots())
票数 2
EN

Stack Overflow用户

发布于 2013-07-29 09:51:34

让答案成为班上的一员。并通过self.answer进行参考。

代码语言:javascript
复制
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
票数 3
EN

Stack Overflow用户

发布于 2013-07-29 09:51:57

将其存储在对象本身中:

代码语言:javascript
复制
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()
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/17920816

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档