调用方法时出错,但调用该方法的对象确实定义了该方法。
这是调用方法的地方:
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实例呢?
答案 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())
也没关系!