对于Python的内建对象,比如int、dict、list等,通过str()方法,可以把这些对象转换为字符串对象输出。
num = 12 str(num) # ==> '12' d = {1: 1, 2: 2} str(d) # ==> '{1: 1, 2: 2}' l = [1,2,3,4,5] str(l) # ==> '[1, 2, 3, 4, 5]'
对于自定义对象,通过str()方法,同样可以得到对象所对应的字符串结果,只不过结果会有些难理解。
class Person: pass bob = Person() str(bob) # ==> '<__main__.Person object at 0x7fc77b859c50>'
<__main__.Person object at 0x7fc77b859c50>这个结果其实是Animal的实例cat在内存中的地址,这是相当难以理解的,不过引发思考的是,通过str()打印的数据,是怎么来的呢?
这其实是对象的内建方法__str__返回的。
通过dir()方法,我们可以把对象的所有方法打印出来。
>>> dir(list) ['__add__', '__class__', '__contains__', '__delattr__', '__delitem__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__getitem__', '__gt__', '__hash__', '__iadd__', '__imul__', '__init__', '__init_subclass__', '__iter__', '__le__', '__len__', '__lt__', '__mul__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__reversed__', '__rmul__', '__setattr__', '__setitem__', '__sizeof__', '__str__', '__subclasshook__', 'append', 'clear', 'copy', 'count', 'extend', 'index', 'insert', 'pop', 'remove', 'reverse', 'sort']
可以看到,int、dict、list等的内建对象都实现了自己的__str__()方法,可以把相应的字符串返回,如果我们的类也想把容易理解的字符串输出的话,那么我们也需要实现类的__str__()方法。
class Person(object): def __init__(self, name, gender): self.name = name self.gender = gender def __str__(self): return 'name: {}, gender: {}'.format(self.name, self.gender) bob = Person('Bob', 'Male') str(bob) # ==> 'name: Bob, gender: Male'
但是,对于直接在终端输入变量bob,得到的依然是这样结果。
>>> bob <__main__.Person object at 0x7fc77b859cc0>
而对于int、list等的对象,直接输入变量也可得到可读的结果。
>>> num = 12 >>> str(num) '12' >>> d = {1: 1, 2: 2} >>> d {1: 1, 2: 2}
__str__()函数似乎没有在自定义类Person中生效,这是为什么呢?
这是因为 Python 定义了__str()__和__repr__()两种方法,__str()__用于显示给用户,而__repr__()用于显示给开发人员,当使用str()时,实际调用的是__str__()方法,而直接输入变量,调用的是__repr__()方法。
class Person(object): def __init__(self, name, gender): self.name = name self.gender = gender def __str__(self): return 'name: {}, gender: {}'.format(self.name, self.gender) def __repr__(self): return 'name: {}, gender: {}'.format(self.name, self.gender) bob = Person('Bob', 'Male') str(bob) # ==> 'name: Bob, gender: Male' >>> bob 'name: Bob, gender: Male'
请给Student 类定义__str__和__repr__方法,使得能打印出'Student: name, gender, score'。
参考答案:
class Person(object): def __init__(self, name, gender): self.name = name self.gender = gender class Student(Person): def __init__(self, name, gender, score): super(Student, self).__init__(name, gender) self.score = score def __str__(self): return 'Student: {}, {}, {}'.format(self.name, self.gender, self.score) def __repr__(self): return 'Student: {}, {}, {}'.format(self.name, self.gender, self.score) s = Student('Bob', 'Male', 88) print(s)
请验证,完成请求
由于请求次数过多,请先验证,完成再次请求
打开微信扫码自动绑定
绑定后可得到
使用 Ctrl+D 可将课程添加到书签
举报