纯粹是化妆品,但是当我在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
,而这些函数在拥有,他们不会影响班级的价值。)
答案 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>
答案 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>'