|
| 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