2016-04-02 13 views
0

メソッドを呼び出すときにエラーが発生しましたが、メソッドが呼び出されるオブジェクトがそのメソッドを定義します。メソッドが呼び出されるのはここバインドされていないメソッドを呼び出すときにタイプエラーが発生しましたが、クラス_does_がそのメソッドを定義しました

は次のとおりです。

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の種類を確認するには、それはですインスタンス。 locがIntegerBoxのインスタンスではないと思われるのはなぜですか?

+0

あなたは 'interpret'のコードを表示する必要があります。好奇心から外に – BrenBarn

答えて

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が生成されます。これは、メソッドがクラスの特定のインスタンスにバインドされていないためです。だから、

C.m()TypeError

C().m()を上げるには、

C.m(C())もOKですOKです!

+0

、あなたはクラスがオブジェクトの代わりに呼び出されていたことをどのように知っていましたか? –

+0

@JeremyFisherなぜなら、アンバウンドメソッドが意味するものだからです。私は答えにもっと追加しました。 – snakecharmerb

+1

また、これはPython 2がPython 3であることを知ることができます。なぜなら、Python 3はバインドされていないメソッドを別の型として取り除いたからです。インスタンス名の代わりにクラス名を使用しても同じエラーが発生しますが、エラーメッセージは "TypeError:m()は他の関数と同じ、正確に1つの位置引数(0が与えられます)"です。 –

関連する問題