0

我在下面尝试这段代码,但想知道为什么它不起作用..

你能告诉我是什么问题吗?

代码.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()
4

4 回答 4

4

C1 一开始是一个方法——你调用 .A1(),它调用 .B1(),它调用 .C1(),它返回 2。到目前为止,一切都很好。

然后,您将 .C1 设为值 (3) - 您调用 .A1(),它调用 .B1(),它试图调用 .C1(),因为值 3 不可调用而导致崩溃。

也许你想要类似的东西

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-19T21:52:03.010 回答
2

在您的类中,该变量C1只是一个包含实例方法的变量。将其设置为等于会3覆盖该功能。

例如:

def foo():
  print 4

foo = 12  # foo is now the number 12, not a function

你做了同样的事情:

spreadsheet.C1 = 3

C1 一个函数,但现在它是一个数字。你不能拨打一个号码。

于 2012-09-19T21:55:43.463 回答
1

你的意思是,如果你执行 main 你在打印电子表格时会得到一个 TypeError.A1()

这是因为您覆盖了实例变量 C1。它被分配给一个函数,但随后您将其重新分配给整数 3。当它尝试处理实例方法 A1 时,它最终会尝试调​​用 self.C1() 并找到一个整数,该整数不能被调用且不应该t 后面有括号,所以它会正确地引发错误。

根据您想要发生的情况,您有多种选择。

  • 接受这是正常行为,不要覆盖实例过程。
  • 为 C1 定义一个设置器,该设置器要么在该点返回错误,要么静默不做任何事情。
于 2012-09-19T22:04:55.987 回答
1

名称“C1”指的是一种方法(可调用对象)。但是随后您将“C1”属性分配给一个整数(不可调用),并破坏该方法。然后,当您使用它调用它时self.C1(),它将不再起作用。

于 2012-09-19T21:52:10.007 回答