1

纯粹是一个装饰性的东西,但是当我在 python 中创建一个类时,我如何控制它的实例的标题?例如对于

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

然后我可以创建一个实例:

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

如果我想让它返回bar,我会怎么做?(在 Django 中,您使用__unicode__类的方法,但我尝试将__unicode____str__函数都设置为 return 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(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,您将获得输出repr()而不是str()。如果你想改变它,你需要定义__repr__而不是__str__or __unicode__

通常,无论如何您都会使用str()输出(打印使用它,当强制字符串时它被使用)。repr()仅在您要求时才使用,例如:

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

你混淆了一些东西,

使用时设置类的名称Class Foo:。这创建了一个class名为Foo.

现在,当您执行f = Foo('bar')thenf时,解释器会轻松调用您实例的__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 回答