1

純粋に表面的なことですが、Python でクラスを作成するとき、そのインスタンスのタイトルをどのように制御すればよいですか? 例えば

class Foo():
    def __init__(self, name):
         self.name = name

その後、インスタンスを作成できます。

>> f = Foo('bar')
>> f
<Foo instance at 0x10ab41a28>

それを返してほしいとしたらbar、どうしますか? (Django では、クラスのメソッドを使用しますが、関数と関数__unicode__の両方を returnに設定しようとしました。これらは単独で動作しますが、クラスの値には影響しません。)__unicode____str__self.name

4

4 に答える 4

4

私は通常__str__、文字列表現を返すように定義してから、次の__repr__ようにメソッドで文字列を返します。

>>> class Foo():
...     def __init__(self, name):
...          self.name = name
...     def __str__(self):
...          return '<Foo name=%s>' % self.name
...     def __repr__(self):
...          return str(self)
... 
>>> f = Foo('bar')
>>> f
<Foo name=bar>

詳細については、「Pythonでのstrreprの違い」を参照してください。

于 2012-07-04T16:54:33.163 に答える
2

代わりに定義__repr__してください - それはあなたを整理します。

于 2012-07-04T16:53:29.053 に答える
1

あなたはいくつかのことを混同しています。

を使用したときにクラスの名前を設定しますClass Foo:。これにより、classという名前の が作成されましたFoo

これで、 と を実行するf = Foo('bar')f、インタープリターがインスタンスの__repr__メソッドを手軽に呼び出します。

>>> class Foo():
...  def __repr__(self):
...   return 'REPR'
... 
>>> f = Foo()
>>> 
>>> f
REPR
>>> 

簡単に__repr__言うと、f.

そうしないと、インタプリタが多かれ少なかれそれを行います:

>>> class F():
...  pass
... 
>>> f = F()
>>> f.__repr__
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AttributeError: F instance has no attribute '__repr__'
>>> repr(f)
'<__main__.F instance at 0x7f00381e2368>'
于 2012-07-04T16:54:55.047 に答える
1

この場合、クラスの問題ではありません。

class Foo(object):
  def __init__(self, name):
    self.name = name
  def __str__(self):
    return self.name

>>> f = Foo()
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: __init__() takes exactly 2 arguments (1 given)
>>> f = Foo("bar")
>>> f
<__main__.Foo object at 0x7f2a9b9b7590>
>>> print(f)
bar

問題は、 と入力するだけで、ではなく のf出力が得られることです。それを変更したい場合は、 orの代わりに定義する必要があります。repr()str()__repr____str____unicode__

通常はstr()とにかく出力を使用します (使用される文字列に強制する場合、print はそれを使用します)。repr()実際には、次のように要求した場合にのみ使用されます。

>>> print("{0!r}".format(f))
<__main__.Foo object at 0x7f2a9b9b7590>
于 2012-07-04T16:54:12.377 に答える