如何在Python中控制类的实例标题?

时间:2012-07-04 16:49:39

标签: python class

纯粹是化妆品,但是当我在python中创建一个类时,如何控制其实例的标题?例如对

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

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

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

如果我想要返回bar,我该怎么办? (在Django中,您使用了类的__unicode__方法,但我尝试将__unicode____str__函数设置为返回self.name,而这些函数在拥有,他们不会影响班级的价值。)

4 个答案:

答案 0 :(得分: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>

有关详细信息,请参阅Difference between str and repr in Python

答案 1 :(得分:2)

改为定义__repr__ - 这会让你感到厌烦。

答案 2 :(得分: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____unicode__

通常,无论如何你都会使用str()输出(print使用它,当强制使用它时会被使用)。 repr()实际上只在您要求时使用,例如:

>>> print("{0!r}".format(f))
<__main__.Foo object at 0x7f2a9b9b7590>

答案 3 :(得分: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>'