2017-03-10 7 views
0

私は、タプルを置き換えるために使用しているポイントを表すクラスを持っています。タプルで私はちょうど呼び出すことができますx, y = pointどのようにクラスでこの機能をエミュレートできますか? __repr__はタプルを返すことができますが、printを呼び出そうとするとTypeError: __repr__ returned non-string (type tuple)がスローされます。この機能はタプルのためにどのように処理されますか?Pythonクラス。値に割り当てられたときよりも、印刷や書式で呼び出されたときに値が異なる

+0

ここでのアドバイスを読んで、それに従ってください:[最小限で完全であり、かつ検証可能な例の作成方法](http://www.stackoverflow.com/help/mcve) –

+4

これは非常に混乱しているようです。 'x、y = some_object'はアンパックされ、繰り返し可能な型が必要です。 '__repr__'や印刷とは関係ありません。 – Blckknght

+0

あなたの 'Point'クラスは' tuple'や 'list'から継承できます。 –

答えて

4

x, y = some_objectのような複数の代入文の右側にあるタプルのようにクラスのインスタンスを使用できるようにするには、クラスを反復可能にする必要があります。その動作はクラスの__repr__とは関係ありません。

(あなたが必要とする追加のどんな方法で)このような何かを試してみてください。このクラスの

class Point(object): 
    def __init__(self, x, y): 
     self.x = x 
     self.y = y 

    def __iter__(self): 
     yield self.x 
     yield self.y 

    def __repr__(self): 
     return "{}({}, {})".format(type(self).__name__, self.x, self.y) 

インスタンスがアンパックが動作することを意味し、反復可能です。また、印刷するか、strまたはreprで文字列に変換することもできます。

+0

ありがとう、これは私が必要なものです! –

2

独自のクラスを使用しないで、collections.namedtupleを代わりに使用しますか? help(collections.namedtuple)はポイントタイプの例でもあります

1

アンパックは本質的に反復です。ここでは、Pointクラスでこれを実装する方法の概略は以下のとおりです。

>>> class Point: 
...  def __init__(self, x=0, y=0): 
...   self._values = (x, y) 
...  def __iter__(self): 
...   return iter(self._values) 
... 
>>> p = Point(1,2) 
>>> a,b = p 
>>> a 
1 
>>> b 
2 
>>> 

編集は、当然のことながら、ここで私はタプルをラップしますが、iterator protocol実装して何かを解凍することができます。

関連する問題