2017-03-29 11 views
-1

私は3D座標(x、y、z)を表す "Point"という名前のクラスを構築しようとしています。私はこのポイントに値を割り当てることはできません、関数呼び出しにどのように値を割り当てることができますか?

p = Point() 
print p(1 ,1, 1) # output : False` 

をしかし:

class Point(object): 

    def __init__(self): 
     a = 3 
     self.data = [[[bool(False) for x in xrange(a)] for y in xrange(a)] for z in xrange(a)] 

    def __call__(self, x, y, z): 
     return 'call :'+self.data[x][y][z]' 

私は簡単にポイントにアクセスすることができます!

p(1, 1, 0) = True # SyntaxError: can't assign to function call 

これはがそれを評価するをしようとするPythonがさえ気にしないことを意味SyntaxErrorであることを

SyntaxError: can't assign to function call

注:あなたがいることを書いた場合

+2

class Point(object): def __init__(self): a = 3 self.data = [[[bool(False) for x in xrange(a)] for y in xrange(a)] for z in xrange(a)] def __setitem__(self,idx,val): i,j,k = idx self.data[i][j][k] = val def __call__(self, x, y, z): return 'call :'+str(self.data[x][y][z])

は、今では次のように動作しますか? Pythonで呼び出しに割り当てることはできません。 –

+0

また、文字列とboolの '' call: '+ self.data [x] [y] [z] 'を連結することはできません。 – RaminNietzsche

+0

'ポイント 'は本当に**キューブです**:3 x 3 x 3立方体。 –

答えて

0

はさて、あなたは次のエラーを取得します。 Pythonの文法にないのはなので、そのように動作するはずはありません。あなたが求めるものにビット近づく

事は(これらは角括弧であることに注意してください)あなたはp[1,1,0]に割り当てることができるように__setitem__関数をオーバーライドです。同様に:予想される動作がどうなるかよく

>>> p = Point() 
>>> p(1,1,0) 
'call :False' 
>>> p[1,1,0] = True # note the square brackets 
>>> p(1,1,0) 
'call :True' 
+0

ありがとうございます。 – iakoutsk

+0

私の唯一の懸念は、getとsetメソッドで同じではない構文についてです:p [1,1,0] =値を設定するにはTrue、値を取得するにはp(1、1、0)...とにかく、ご協力ありがとうございます ! – iakoutsk

+0

@iakoutsk: 'p(1,1,0)'ではなく 'p [1,1,0]'で値を取得するように '__getitem__'をオーバーライドすることもできます... –

関連する問題