2016-11-15 10 views
-4

(Pythonの3.5.2)__repr__を複数の引数で使用するにはどうすればよいですか?

次のように私は私のクラスのいずれかの__repr__を定義しています

class d(): 
    def __init__(self): 
     self._values = [] 
     return 
    def __pos__(self): 
     return self._values[0] 
    def __repr__(self, value): 
     self._values.append(value) 
     return 

は今、私は

x = d() 
print(x,"a") 
print(+x) 

a

を返すようにしたいです

代わりに、私は、そのような運とprint(x),"a"など、いくつかのバリエーションを試してみた

TypeError: __repr__() missing 1 required positional argument: 'value'

を取得します。

+7

... '__repr __()は' *任意の*引数を取ることはありません... –

+0

そして、あなたの関数は、文字列ではなく、何を返すべき。 initはまたreturn文を必要としません –

+0

(技術的には何も返しませんが、少なくとも 'None'を' __init __() 'から返します) –

答えて

1

お使いの__repr__は間違った方法です。 __repr__を使用して、オブジェクトの表現を印刷可能な形式で返す必要があります。 Pythonではオブジェクトの名前とメモリアドレスを単に出力するのではなく、オブジェクトの「公式」の文字列表現を計算するためにrepr()組み込み関数によって呼び出され

__repr__のドキュメントあたり。可能であれば、これは適切な環境を与えられた同じ値を持つオブジェクトを再作成するのに使用できる有効なPython式のように見えるはずです。これが不可能な場合は、< ...いくつかの有用な説明...>の文字列を返す必要があります。戻り値は文字列オブジェクトでなければなりません。クラスが__repr__()を定義し、__str__()を定義しない場合、そのクラスのインスタンスの「非形式的」文字列表現が必要な場合は__repr__()も使用されます。

あなたは__repr__を使って達成しようとしていますか?あなたは単に、dのメソッドを介してself.valuesに要素を追加マジックメソッドを捨て、ちょうど作成したい場合は、あなた自身:あなたのクラスのインスタンスが表示される方法を制御したい場合

class d(): 
    def __init__(self): 
     self._values = [] 

    def __pos__(self): 
     return self._values[0] 

    def append(self, value): # create your won function 
     self._values.append(value) 
2

、正しい道へそれは__format__メソッドを上書きすることです。オブジェクトは通常、デバッグ支援として、対話インタプリタで表示する必要がある場合に使用 -

  1. __repr__:一般的には、あなたがオーバーライドできる3つの方法がするために使用されています。可能であれば、評価されればオブジェクトを再作成できる文字列でなければなりません。
  2. __str__ - オブジェクトがstrに渡されたとき、またはprintがオブジェクトを表示しようとしたときに使用されます。別の定義がなければ、単に__repr__を呼び出します。これは、インスタンスの「デフォルトの」文字列表現です。
  3. __format__ - オブジェクトがstr.formatの引数である場合に使用されます。置換フィールドにオプションの:の後に現れるフォーマット指定(もしあれば)を追加の引数として受け取ります。

ここでは、数字のペアを表す簡単な例を示します。数字を区切るために使用される文字は、書式指定で設定できます。

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

    def __format__(self, spec): 
     return "{}{}{}".format(self.x, spec, self.y) 

    def __str__(self): 
     return "{:/}".format(self) 

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

次のようにそれを使用することができます。

>>> x = Pair(1,2) 
>>> x # using __repr__ 
Pair(1, 2) 
>>> str(x) # using __str__, with a default separator of/
'1/2' 
>>> print(x) # uses __str__ implicitly 
1/2 
>>> "{}".format(x) # no separator specified 
'12' 
>>> "{:-}".format(x) # use - to separate the two numbers 
'1-2' 
関連する問題