首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Python面向对象的实现

Python面向对象的实现
EN

Stack Overflow用户
提问于 2012-09-20 05:48:43
回答 4查看 149关注 0票数 0

我正在尝试下面的这段代码,但我想知道为什么它不能工作。

你能告诉我问题出在哪里吗,

code.py

代码语言:javascript
运行
复制
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()
EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2012-09-20 06:04:56

您的意思是,如果执行main,那么在打印spreadsheet.A1()时会得到一个TypeError。

这是因为您覆盖了实例变量C1。当它试图处理实例方法A1时,它最终试图调用self.C1()并找到一个整数,这个整数不能被调用,后面也不应该有括号,所以它正确地抛出了一个错误。

根据您希望发生的情况,您有几种选择。

  • 接受这是正常行为,并且不要覆盖C1设置程序的实例,否则将在该点返回错误或静默不执行任何操作。
票数 1
EN

Stack Overflow用户

发布于 2012-09-20 05:52:03

C1首先是一个方法--您调用.A1(),它调用.B1(),它调用.C1(),.C1()返回2。

然后将.C1设为value (3) -调用.A1(),后者调用.B1(),后者尝试调用.C1(),但由于值3不可调用,导致.C1()失败。

也许你想要这样的东西

代码语言:javascript
运行
复制
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
票数 4
EN

Stack Overflow用户

发布于 2012-09-20 05:55:43

在您的类中,变量C1只是一个保存实例方法的变量。将其设置为等于3会覆盖该函数。

例如:

代码语言:javascript
运行
复制
def foo():
  print 4

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

你也做了同样的事情:

代码语言:javascript
运行
复制
spreadsheet.C1 = 3

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

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12503408

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档