Python之面向对象 2
0X00 Python3的super
Python中对象的概念都快被大家淡忘了,因为一切都是对象(话虽然这么说,但是怎么可能淡忘对象呢)。看下面一段Python2的代码,Python2中麻烦的就是这个super()的用法。
1class Human:
2 def __init__(self):
3 self.name = 'human'
4 print 'hello, i im', self.name
5
6
7class Student(Human):
8 def __init__(self):
9 super(Student, self).__init__()
10 self.name = 'student'
11 print 'hello, i im', self.name
12
13
14a = Student()在初学Python的时候,如果是Python2很大可能会在super(Student, self).__init__()这段迷惑好一阵子,不过好在Python2马上就要凉透了,在Python3中可以将代码改写成如下方式
1class Human: # 不用强行继承自object了
2 def __init__(self):
3 self.name = 'human'
4 print('hello, i im', self.name)
5
6
7class Student(Human):
8 def __init__(self):
9 super().__init__() # super的用法也更明了
10 self.name = 'student'
11 print('hello, i im', self.name)
12
13
14a = Student()其中super的用法由super(Student, self).__init__()改成了super().__init__(),看起来清晰多了,在使用Python3后不建议以任何理由使用老式Python中的super调用。
0X01 str
写一个自己的类通常都需要实现一个__str__方法,这个方法用于粗略的展示对象,可以看下面这个例子。
1class Student:
2 def __init__(self, name, age, gender):
3 self.name = name
4 self.age = age
5 self.gender = gender
6
7 # 下面这一堆xxx表示其他很多属性
8 # self.xxxx = xxxx
9 # self.xxxx = xxxx
10 # self.xxxx = xxxx
11 # self.xxxx = xxxx
12 # self.xxxx = xxxx
13 # self.xxxx = xxxx
14 # self.xxxx = xxxx
15
16 def __str__(self):
17 return 'name:{} age:{} gender:{}'.format(self.name, self.age, self.gender)
18
19
20a = Student('shawn', '24', 'm')
21b = Student('lucy', '24', 'f')
22c = Student('bill', '24', 'm')
23
24print(a)
25print(b)
26print(c)可以尝试先把__str__的定义注释掉执行一下,看到的输出应该是类似这样的:
1<__main__.Student object at 0x7f875f881d10>
2<__main__.Student object at 0x7f875f881d90>
3<__main__.Student object at 0x7f875f881e10>如果再取消__str__的注释,看到的输出就是这样的了:
1name:shawn age:24 gender:m
2name:lucy age:24 gender:f
3name:bill age:24 gender:m可以看到输出变成肉眼可识别的了。
通过 str(object) 以及内置函数 format() 和 print() 调用以生成一个对象的“非正式”或格式良好的字符串表示。返回值必须为一个 字符串 对象。 此方法与 object.repr() 的不同点在于 str() 并不预期返回一个有效的 Python 表达式:可以使用更方便或更准确的描述信息。 内置类型 object 所定义的默认实现会调用 object.repr()。 官方文档
0X02 repr
__str__其实很多人都是知道的,毕竟这也算是Python中最基础的部分之一了,不过这里的__repr__貌似就有些同学不太清楚了。__repr__的功能和__str__是类似的,不过__str__输出的结果是方便肉眼识别的,而__repr__输出的结果是”可以通过输出反向还原对象“的,换句话说就是带有对象的详尽信息。
1a = {'a': 1, 'b': 2, 'c': 3}
2print(repr(a))
3
4b = {'a': a, 'b': a, 'c': a}
5print(repr(a))执行上面这坨代码就理解这个方法的基本情况了,注:repr(a)算是a.__repr__()的语法糖了,效果相同。
由 repr() 内置函数调用以输出一个对象的“官方”字符串表示。如果可能,这应类似一个有效的 Python 表达式,能被用来重建具有相同取值的对象(只要有适当的环境)。如果这不可能,则应返回形式如 <…some useful description…> 的字符串。返回值必须是一个字符串对象。如果一个类定义了 repr() 但未定义 str(),则在需要该类的实例的“非正式”字符串表示时也会使用 repr()。 此方法通常被用于调试,因此确保其表示的内容包含丰富信息且无歧义是很重要的。 官方文档
如果这篇文章对你有帮助,可以请我喝杯咖啡 ☕
评论