我有一个解决二次方程的函数:
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
如果需要,打印二次方程的答案。
如何从上面的函数中为此功能提供 答案 列表以进行打印?
答案 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 variable(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()
简而言之,实例变量(数据成员)只是一个变量,其生命周期与其“所有者”相同(在示例中,{{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()