下面是一个简单的类
class Person:
"""Class to represent a person
"""
def set_age(self,age):
if 0<age<150:
self.age=age
def __init__(self,name='',age=0):
self.name = name
self.age = age
def display(self):
print("Person('%s',%d)" % (self.name, self.age))
def __str__(self):
return "Person('%s',%d)" % (self.name, self.age)
def __repr__(self):
return "Person('%s',%d)" % (self.name, self.age)
一、__str__和__repr__用来干什么?
类中的__str__和__repr__,是为了用来显示对象内容的。
如果有这两个方法时,我们就可以显示该类的对象的内容。
我们写类时,至少应该有__repr__,这时,如果调用str()方法,则会调用__repr__。两个方法中的语句,应该是显示类的内容的。这样使类的使用与其它基本类相同。
上例中,两个方法的代码一样,但一般应写得不一样。
二、举例
>>>p=Person('White',22)
>>>p
'White',22
如果没有__repr__,则上面的显示就是
'<__main__.Person object at 0x000002215F8E5208>'
如果有__str__,则
>>>str(p)
'White',22
如果没有__str__和__repr__,上面的显示就是
'<__main__.Person object at 0x0000017F23F44B48>'
上面显示中,内存的地址可能不同,是因环境而变化的。
三、两个方法应该怎样不一样?
没有规定两个方法应该怎样写。我们来看python自己的一个类datetime
>>>import datetime
>>>today=datetime.date.today()
>>>today
datetime.date(2019, 11, 10)#这是__repr__返回的值。
>>>str(today)
'2019-11-10'#这是__str__返回的值,更容易读
从这个例子,看到该类作者的意图:
__str__ 的返回结果可读性强。也就是说,__str__ 的意义是便于人们阅读信息。
__repr__ 的返回结果应更准确。__repr__ 存在的目的在于调试,便于开发者使用。我们发现将 __repr__ 返回的方式直接复制到命令行上,是可以直接执行的。
网友评论