OOP- Object Oriented Programming. 把对象作为程序的基本单元,一个对象包含数据和函数,计算机程序执行就是消息在各个对象之间的传递。
1. 类和实例及访问限制
1 | #!/usr/bin/env python |
2. 继承和多态
多态:使用单一接口操作具有相似特性数据的能力
1 | #!/usr/bin/env python |
3. 获取对象信息
3.1. type()
1 | #判断基本类型 |
3.2. isinstance()
1 | #type()能判断的,isinstance()也可以, 但是应用场景不同 |
3.3. dir()
获取一个对象的所有属性和方法
1 | dir('abc') |
4. 实例属性和类属性
1 | #通常使用self变量或者实例变量来给实例绑定属性; 而这种直接在类中定义的属性为类属性; |
5. slots 限制实例属性
1 | #!/usr/bin/env python |
6. @property 像访问属性一样的访问类方法,且约束访问权限
6.1. 属性无法被保护,且没有参数检测
1 | class Screen(object): |
6.2. 属性被保护了,但是访问属性的方式变了 – Method
1 | class Screen(object): |
6.3. 利用property
1 | #!/usr/bin/env python |
6.4. property类原型
1 | def __init__(self, fget=None, fset=None, fdel=None, doc=None) |
7. 多重继承与MixIn设计
1 | #!/usr/bin/env python |
8. 定制类
8.1. str 与 repr 描述对象信息
1 | #__str__ : 强调可读性,结果是让人看的 |
8.2. iter
如果一个类想被用于for循环就必须实现一个iter()方法,该方法返回一个迭代对象,for循环会不断的调用该迭代对象的next()方法,直到遇到StopIteration退出。
1 | class Fib(object): |
8.3. getitem
1 | #通过__iter__()实现的例子虽然能用于for循环,但是却无法像List一样的使用 |
8.4. getattr
可以用于把一个类的属性和方法动态化处理
1 | #如果找不到类属性or类方法, 则会去__getattr__中寻找; 因此加了判断。通过这种方法来实现动态。 |
8.5. call 实现类实例本身的调用
1 | class Student(object): |
9. 枚举类
枚举类型可以看做是一种标签或一组常量集合,例如:月份、星期、状态等。
字典和类也可实现,但是存在几个问题:
- 变量可更改
- 字符串所占内存比数字大
9.1. 使用枚举类
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56#使用字典
Week = {
'Sun': 0,
'Mon': 1,
'Tue': 2,
'Wed': 3,
'Thu': 4,
'Fri': 5,
'Sat': 6,
}
#使用类
class Week(object):
Sun = 0
Mon = 1
Tue = 2
Wed = 3
Thu = 4
Fri = 5
Sat = 6
#使用 枚举类
from enum import Enum
#(1).方式一
class Week(Enum):
Sun = 0
Mon = 1
Tue = 2
Wed = 3
Thu = 4
Fri = 5
Sat = 6
for d in Week:
print(d.name, '=', d.value)
#输出
Sun = 0
Mon = 1
Tue = 2
Wed = 3
Thu = 4
Fri = 5
Sat = 6
#(2).方式二
Week = Enum('Week', ('Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'))
for name, member in Week.__members__.items():
print(name, '=>', member, ',', member.value - 1)
#输出
Sun => Week.Sun , 0
Mon => Week.Mon , 1
Tue => Week.Tue , 2
Wed => Week.Wed , 3
Thu => Week.Thu , 4
Fri => Week.Fri , 5
Sat => Week.Sat , 6
9.2. 定义枚举类
1 | #成员名(key)不能重复 |
9.3. 枚举取值
1 | #通过成员名 |
9.4. 枚举比较
1 | #is: 同一性比较 |
9.5. IntEnum,扩展类,支持比较
1 | from enum import IntEnum |
10. 元类
ToDo