代码实例中的python版本:3.6
__str__方法用于返回对象的描述信息,如果不使用__str__方法,直接print,或者return,返回的是对象的内存地址。如果在__str__中定义了描述信息,print或者return时,返回的就不是内存地址,显示更友好,实现了类到字符串的转化。
实例:
1、没有使用__str__方法返回的结果
class Student:
def __init__(self, name, age):
self.name = name
self.age = age
def school(self):
print("我的学校是...")
def subject(self):
print("我的学科")
def introduce(self):
print("姓名:%s,年龄:%d" % (self.name, self.age))
zs = Student("张三", 20)
ls = Student("李四", 18)
print(zs)
print(ls)
ls.school()
zs.subject()
zs.introduce()
结果:
<__main__.Student object at 0x000001B26CB101D0>
<__main__.Student object at 0x000001B26CB10208>
我的学校是...
我的学科
姓名:张三,年龄:20
2、使用__str__方法返回的结果
class Student:
def __init__(self, name, age):
self.name = name
self.age = age
def __str__(self):
return "%s的年龄是:%d" % (self.name, self.age)
def school(self):
print("我的学校是...")
def subject(self):
print("我的学科")
def introduce(self):
print("姓名:%s,年龄:%d" % (self.name, self.age))
zs = Student("张三", 20)
ls = Student("李四", 18)
print(zs)
print(ls)
ls.school()
zs.subject()
zs.introduce()
结果:
张三的年龄是:20
李四的年龄是:18
我的学校是...
我的学科
姓名:张三,年龄:20
3、两个方法的区别:
a、调用的时机不同,__str__是在生成对象
b、列表以及字典等容器总是会使用 __repr__ 方法。即使你显式的调用 str 方法,也是如此。
c、我们需要显示的指定以何种方式进行类到字符串的转化,我们可以使用内置的 str() 或 repr() 方法,它们会调用类中对应的双下划线方法。
d、__str__ 的返回结果可读性强,得到便于人们阅读的信息。__repr__ 的返回结果应更准确,__repr__ 存在的目的在于调试,便于开发者使用。将 __repr__ 返回的方式直接复制到命令行上,是可以直接执行的。
e、自己写class的时候要加__repr__,如果没有添加 __str__ 方法,Python 在需要该方法但找不到的时候,它会去调用 __repr__ 方法。因此,在写自己的类的时候至少添加一个 __repr__ 方法,这能保证类到字符串始终有一个有效的自定义转换方式。
f、在同一个类中,同时有__str__,__repr__,默认调用的是__str__。
class Student:
def __init__(self, name, age):
self.name = name
self.age = age
def __str__(self):
return "%s的年龄是:%d" % (self.name, self.age)
def school(self):
print("我的学校是...")
def subject(self):
print("我的学科")
def introduce(self):
print("姓名:%s,年龄:%d" % (self.name, self.age))
def __repr__(self):
return "__repr__:{0}:{1}".format(self.name,self.age)
zs = Student("张三", 20)
ls = Student("李四", 18)
print(zs)
print(ls)
print("str调用:" + str(zs))
print("repr调用:" + repr(zs))
print("容器:" + str([ls]))
结果:
张三的年龄是:20
李四的年龄是:18
str调用:张三的年龄是:20
repr调用:__repr__:张三:20
容器:[__repr__:李四:18]