Skip to content

Commit 0cfcf93

Browse files
committed
feat:面向对象进阶
1 parent 0bb8bb4 commit 0cfcf93

File tree

1 file changed

+224
-0
lines changed

1 file changed

+224
-0
lines changed

doc/oop_advanced.md

+224
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,224 @@
1+
# 面向对象进阶
2+
3+
# 目标
4+
5+
- 面向对象三大特性
6+
- 类属性和实例属性
7+
- 类方法和静态方法
8+
9+
# 一. 面向对象三大特性
10+
11+
- 封装
12+
- 将属性和方法书写到类的里面的操作即为封装
13+
- 封装可以为属性和方法添加私有权限
14+
- 继承
15+
- 子类默认继承父类的所有属性和方法
16+
- 子类可以重写父类属性和方法
17+
- 多态
18+
- 传入不同的对象,产生不同的结果
19+
20+
21+
22+
# 二. 多态
23+
24+
## 2.1 了解多态
25+
26+
多态指的是一类事物有多种形态,(一个抽象类有多个子类,因而多态的概念依赖于继承)。
27+
28+
- 定义:多态是一种使用对象的方式,子类重写父类方法,调用不同子类对象的相同父类方法,可以产生不同的执行结果
29+
- 好处:调用灵活,有了多态,更容易编写出通用的代码,做出通用的编程,以适应需求的不断变化!
30+
- 实现步骤:
31+
- 定义父类,并提供公共方法
32+
- 定义子类,并重写父类方法
33+
- 传递子类对象给调用者,可以看到不同子类执行效果不同
34+
35+
## 2.2 体验多态
36+
37+
``` python
38+
class Dog(object):
39+
def work(self): # 父类提供统一的方法,哪怕是空方法
40+
print('指哪打哪...')
41+
42+
43+
class ArmyDog(Dog): # 继承Dog类
44+
def work(self): # 子类重写父类同名方法
45+
print('追击敌人...')
46+
47+
48+
class DrugDog(Dog):
49+
def work(self):
50+
print('追查毒品...')
51+
52+
53+
class Person(object):
54+
def work_with_dog(self, dog): # 传入不同的对象,执行不同的代码,即不同的work函数
55+
dog.work()
56+
57+
58+
ad = ArmyDog()
59+
dd = DrugDog()
60+
61+
daqiu = Person()
62+
daqiu.work_with_dog(ad)
63+
daqiu.work_with_dog(dd)
64+
```
65+
66+
67+
68+
# 三. 类属性和实例属性
69+
70+
## 3.1 类属性
71+
72+
### 3.1.1 设置和访问类属性
73+
74+
- 类属性就是 **类对象** 所拥有的属性,它被 **该类的所有实例对象 所共有**
75+
- 类属性可以使用 **类对象****实例对象** 访问。
76+
77+
``` python
78+
class Dog(object):
79+
tooth = 10
80+
81+
82+
wangcai = Dog()
83+
xiaohei = Dog()
84+
85+
print(Dog.tooth) # 10
86+
print(wangcai.tooth) # 10
87+
print(xiaohei.tooth) # 10
88+
```
89+
90+
> 类属性的优点
91+
>
92+
> - **记录的某项数据 始终保持一致时**,则定义类属性。
93+
> - **实例属性** 要求 **每个对象** 为其 **单独开辟一份内存空间** 来记录数据,而 **类属性** 为全类所共有 ,**仅占用一份内存****更加节省内存空间**
94+
95+
96+
97+
### 3.1.2 修改类属性
98+
99+
类属性只能通过类对象修改,不能通过实例对象修改,如果通过实例对象修改类属性,表示的是创建了一个实例属性。
100+
101+
``` python
102+
class Dog(object):
103+
tooth = 10
104+
105+
106+
wangcai = Dog()
107+
xiaohei = Dog()
108+
109+
# 修改类属性
110+
Dog.tooth = 12
111+
print(Dog.tooth) # 12
112+
print(wangcai.tooth) # 12
113+
print(xiaohei.tooth) # 12
114+
115+
# 不能通过对象修改属性,如果这样操作,实则是创建了一个实例属性
116+
wangcai.tooth = 20
117+
print(Dog.tooth) # 12
118+
print(wangcai.tooth) # 20
119+
print(xiaohei.tooth) # 12
120+
```
121+
122+
123+
124+
## 3.2 实例属性
125+
126+
``` python
127+
class Dog(object):
128+
def __init__(self):
129+
self.age = 5
130+
131+
def info_print(self):
132+
print(self.age)
133+
134+
135+
wangcai = Dog()
136+
print(wangcai.age) # 5
137+
# print(Dog.age) # 报错:实例属性不能通过类访问
138+
wangcai.info_print() # 5
139+
```
140+
141+
142+
143+
# 四. 类方法和静态方法
144+
145+
## 4.1 类方法
146+
147+
### 4.1.1 类方法特点
148+
149+
- 需要用装饰器`@classmethod`来标识其为类方法,对于类方法,**第一个参数必须是类对象**,一般以`cls`作为第一个参数。
150+
151+
152+
153+
### 4.1.2 类方法使用场景
154+
155+
- 当方法中 **需要使用类对象** (如访问私有类属性等)时,定义类方法
156+
- 类方法一般和类属性配合使用
157+
158+
``` python
159+
class Dog(object):
160+
__tooth = 10
161+
162+
@classmethod
163+
def get_tooth(cls):
164+
return cls.__tooth
165+
166+
167+
wangcai = Dog()
168+
result = wangcai.get_tooth()
169+
print(result) # 10
170+
```
171+
172+
173+
174+
## 4.2 静态方法
175+
176+
### 4.2.1 静态方法特点
177+
178+
- 需要通过装饰器`@staticmethod`来进行修饰,**静态方法既不需要传递类对象也不需要传递实例对象(形参没有self/cls)**
179+
- 静态方法 也能够通过 **实例对象****类对象** 去访问。
180+
181+
## 4.2.2 静态方法使用场景
182+
183+
- 当方法中 **既不需要使用实例对象**(如实例对象,实例属性),**也不需要使用类对象** (如类属性、类方法、创建实例等)时,定义静态方法
184+
- **取消不需要的参数传递**,有利于 **减少不必要的内存占用和性能消耗**
185+
186+
``` python
187+
class Dog(object):
188+
@staticmethod
189+
def info_print():
190+
print('这是一个狗类,用于创建狗实例....')
191+
192+
193+
wangcai = Dog()
194+
# 静态方法既可以使用对象访问又可以使用类访问
195+
wangcai.info_print()
196+
Dog.info_print()
197+
```
198+
199+
200+
201+
# 五. 总结
202+
203+
- 面向对象三大特性
204+
- 封装
205+
- 继承
206+
- 多态
207+
- 类属性
208+
- 归属于类对象的属性,所有对象共有的属性
209+
- 实例属性
210+
- 类方法
211+
212+
``` python
213+
@classmethod
214+
def xx():
215+
代码
216+
```
217+
218+
- 静态方法
219+
220+
``` python
221+
@staticmethod
222+
def xx():
223+
代码
224+
```

0 commit comments

Comments
 (0)