我正在尝试下面的这段代码,但我想知道为什么它不能工作。
你能告诉我问题出在哪里吗,
code.py
class Example():
def A1(self):
return self.B1() + self.B2()
def B1(self):
return 4 * self.C1()
def B2(self):
return 5
def C1(self):
return 2
def main():
spreadsheet = Example()
print spreadsheet.A1()
spreadsheet.C1 = 3
print spreadsheet.A1()
发布于 2012-09-20 06:04:56
您的意思是,如果执行main,那么在打印spreadsheet.A1()时会得到一个TypeError。
这是因为您覆盖了实例变量C1。当它试图处理实例方法A1时,它最终试图调用self.C1()并找到一个整数,这个整数不能被调用,后面也不应该有括号,所以它正确地抛出了一个错误。
根据您希望发生的情况,您有几种选择。
发布于 2012-09-20 05:52:03
C1首先是一个方法--您调用.A1(),它调用.B1(),它调用.C1(),.C1()返回2。
然后将.C1设为value (3) -调用.A1(),后者调用.B1(),后者尝试调用.C1(),但由于值3不可调用,导致.C1()失败。
也许你想要这样的东西
class Spreadsheet(object):
def __getattribute__(self, cell):
val = object.__getattribute__(self, cell)
return val(self) if callable(val) else val
def main():
s = Spreadsheet()
s.a1 = lambda self: self.b1 + self.b2
s.b1 = lambda self: 4 * self.c1
s.b2 = 5
s.c1 = 2
print s.a1 # => 13
s.c1 = 3
print s.a1 # => 17
发布于 2012-09-20 05:55:43
在您的类中,变量C1
只是一个保存实例方法的变量。将其设置为等于3
会覆盖该函数。
例如:
def foo():
print 4
foo = 12 # foo is now the number 12, not a function
你也做了同样的事情:
spreadsheet.C1 = 3
C1
是一个函数,但现在它是一个数字。你不能打电话给一个号码。
https://stackoverflow.com/questions/12503408
复制相似问题