【问题标题】:Python error "unbound method must be called"?Python错误“必须调用未绑定的方法”?
【发布时间】:2016-09-15 08:22:21
【问题描述】:

我开始学习 Python 课程,并想像这样构建一个简单的计算器:

import math

class calculator:
    def plus(self, num1, num2):
        plus = num1 + num2
        print plus
    def minus(self, num1, num2):
        minus = num1 - num2
        print minus
    def power(self, num1, num2):
        power = math.pow(num1, num2)
        return power

C = calculator

num1 = raw_input("1st num > ")
num2 = raw_input("2nd num > ")

C.minus(num1, num2)

但由于某种原因,当我运行脚本时,它向我显示一个错误,指出“必须使用计算器实例作为第一个参数调用未绑定的方法 minus()(而不是获取 str 实例)”。我真的不明白这是什么意思,但我确实尝试过使用脚本,但没有任何改变。那么我在这里错过了什么?

【问题讨论】:

  • 你需要创建一个计算器实例,比如:C =calculator()

标签: python


【解决方案1】:

你没有为你的班级创建一个实例

C = calculator

C 现在只是对类的引用,使C.minus 成为未绑定的方法。

通过调用你的类来创建一个实例:

C = calculator()

或者,将所有函数设为@staticmethods,删除它们的self 参数(但在这种情况下继承object):

class calculator(object):
    @staticmethod
    def plus(num1, num2):
        plus = num1 + num2
        print plus
    @staticmethod
    def minus(num1, num2):
        minus = num1 - num2
        print minus
    @staticmethod
    def power(num1, num2):
        power = math.pow(num1, num2)
        return power

现在您的calculator 类是一个美化的命名空间,即generally frowned upon。如果您不打算使用类来跟踪每个实例的状态,那么您不妨将所有staticmethods 的顶级函数放在一个模块中,而不必“取消绑定”您的方法。

【讨论】:

  • 被谁讨厌?你有参考吗?
  • @DavidCullen 它不如使用模块灵活,也没有任何好处,我认为没有必要参考。
  • @PeterWood:我明白它为什么不受欢迎。但是,我认为在没有提供参考的情况下在 StackOverflow 答案中做出这种陈述通常是不受欢迎的。
  • @DavidCullen:您通常会为此使用模块。这更好地记录了意图;如果您永远不会实例化它并且必须绕过描述符机制才能再次获取函数,为什么还要为类无论如何提供完整的基础架构?
猜你喜欢
  • 2016-12-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-11-06
  • 2014-09-10
  • 1970-01-01
  • 1970-01-01
  • 2014-12-10
相关资源
最近更新 更多