class asd:
def __init__(self):
self.a = a
self.b = b
def fun1(self):
self.a2 = self.a * 2
def fun2(self):
self.a4 = self.a2*2 #this is what i want to do.
class Asd:
def __init__(self):
self.a = a
self.b = b
self.a2 = None
def fun1(self):
self.a2 = self.a * 2
def fun2(self):
if self.a2 is None:
raise ValueError("Attempted to use result from fun1() without first calling fun1()")
self.a4 = self.a2 * 2
或者,您可以自动调用fun1,但在某些情况下,这可能是一种风险更大的设计选择
def fun2(self):
if self.a2 is None:
self.fun1()
self.a4 = self.a2 * 2
不,这是不可能的,变量总是只存在于它们的作用域中。您需要使用全局变量来实现所需的功能,否则必须覆盖实例变量。这取决于您想要解决的问题和代码的设计
在不影响变量作用域的情况下实现这一点的一个好方法是使用sentinel值初始化
self.a2
,通常是None
然后您可以检查
fun2()
中的self.a2
并做出相应的反应,即在表达式之前调用fun1()
:实际上,您还可以去掉sentinel变量,并使用
hasattr()
作为检查:如果您的
self.a2
可以被分配任何值,包括None
,这可能会很有用,从而破坏哨兵的目的。但事实并非如此,因为你在数学表达式中使用它正如@ffm_nosoup所述,由于函数作用域的原因,这不可能按要求实现
完成这类工作的一般方法是在类本身中存储您想要的任何值,并引用这些值。假设
fun1
的结果计算成本很高,并且您不希望在可能的情况下重新计算,您的特定示例可能会改写为:或者,您可以自动调用
fun1
,但在某些情况下,这可能是一种风险更大的设计选择第三种选择是只使用cache,它只会计算函数一次,并在将来重用该结果。(正如Mark Ransom在评论中指出的,如果您需要重新计算fun1的结果,这将导致问题。)
相关问题 更多 >
编程相关推荐