我有一个解二次方程的函数:
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如果我们需要的话,可以打印出二次方程的答案。
我如何从上面的函数中给出这个函数的应答列表来打印?
发布于 2013-07-29 11:01:56
简短的答复已经张贴了。使用实例变量 (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)。
现在印刷。我对这件事比较怀疑。显示本身并不是方程的“本机”属性。如果你这样做,你很快就必须在你的方程类(Es)中处理与“方程”完全无关的问题:如何在文件中写入?二进制还是文本?我应该使用哪种编码?如何处理I/O错误?等等..。
所以,如果我是你,我会向分离关注推进,只提供一个返回根的“访问器”方法--并从外部显示它们。因为这似乎很重要,我在这里保留了访问器和solve方法之间的分离(对于某些类型的方程来说,这可能是计算密集型的)。仅将实例变量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..。更重要的是,使用这种新方程的代码几乎与前一个相同:
eq = OtherEq(1,2,3)
print(eq.roots())发布于 2013-07-29 09:51:34
让答案成为班上的一员。并通过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-29 09:51:57
将其存储在对象本身中:
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()https://stackoverflow.com/questions/17920816
复制相似问题