调用未绑定方法时的TypeError,但类_does_定义该方法

时间:2016-04-02 06:43:19

标签: python methods

调用方法时出错,但调用该方法的对象确实定义了该方法。

这是调用方法的地方:

def interpreter(self, ast, expression, stack) # method in Parser.py file
    ...
    elif isinstance(ast, ReadNode):
            self.interpret(ast.location, environment, stack)
            loc = stack.pop()
            input = sys.stdin.read()
            try:
                num = int(input)
            except:
                sys.stderr.write("error: not an integer")
            loc.set(num)
    ...

我在loc.set(num)

上收到错误消息
Traceback (most recent call last):
  File "/home/filepath/Parser.py", line 846, in <module>
    main()
  File "/home/filepath/Parser.py", line 844, in main
    p.parse()
  File "/home/filepath/Parser.py", line 75, in parse
    self.interpret(instructions, environment, stack)
  File "/home/filepath/Parser.py", line 128, in interpret
    loc.set(num)
TypeError: unbound method set() must be called with IntegerBox instance as first argument (got int instance instead)

这是IntegerBox类:

from Box import Box

class IntegerBox(Box):

    def __init__(self, value=0):
        self.value = value

    def get(self):
        return self.value

    def set(self, value):
        self.value = value

当我通过调试器检查loc的类型时,它是一个IntegerBox实例。为什么它认为loc不是IntegerBox实例呢?

1 个答案:

答案 0 :(得分:2)

loc不是IntegerBox的实例,它是IntegerBox类。

例如:

>>> class C(object):
...     def m(self):
...         pass
... 
>>> C.m()
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: unbound method m() must be called with C instance as first argument (got nothing instead)

但:

>>> c = C()    # create an instance
>>> c.m()  # no error
>>> 

您需要检查放入堆栈对象的内容。

编辑:解释未绑定的方法

在实例上调用方法时,实例将作为第一个参数隐式传递 - 这是方法签名中的self参数。如果在类而不是实例上调用该方法,则必须显式传递实例,否则将引发未绑定方法的TypeError,因为该方法不是&#34;绑定&#34;到该类的特定实例。

所以: C.m()提出TypeError

C().m()没问题

C.m(C())也没关系!