day16 课程(面向对象三大特性:封装 & 继承 & 多态 & 类属性 & 类方法@classmethod & 静态方法@staticmethod)
课程:https://www.bilibili.com/video/BV1o4411M71o?spm_id_from=333.788.videopod.episodes&p=307
16.1 了解面向对象三大特性
16.1.1 目标
面向对象三大特性
类属性和实例属性
类方法和静态方法
16.1.2 三大特性
1.封装:
(1)将属性和方法书写到类里面的操作即为封装
(2)封装可以为属性和方法添加私有权限
2.继承:
(1)子类默认继承父类的所有属性和方法
(2)子类可以重写父类属性和方法
3.多态:
(1)传入不同的对象,产生不同的结果
16.2 了解多态
多态指的是一类事物有多种形态(一个抽象类有多个子类,因而多态的概念依赖于继承)
定义:多态是一种使用对象的方式,子类重写父类方法,调用不同子类的对象的相同父类方法,可以产生不同的执行结果
好处:调用灵活,有了多态,更容易编写出通用的代码,做出通用的编程,以适应需求的不断变化!
实现步骤:
(1)定义父类,并提供公共方法
(2)定义子类,并重写父类方法
(3)传递子类对象给调用者,可以看到不同子类执行的效果不同
注意:Python 中的多态不是必须依赖于继承,但是最好依赖于继承
16.3 体验多态思路分析
需求:警务人员和警犬一起工作,警犬分2种:追击敌人和追查毒品,携带不同的警犬,执行不同的工作
父类:人 -> 工作人员
父类:狗 -> 1.缉毒犬
2.追击犬
传入不同的对象,可以输出不同的结果
16.4 代码实现多态
# 1 定义父类 提供公共方法: 警犬 和 人 class Dog(object): def work(self): print("指哪打哪......") # 哪怕是空 pass 占位符, 因为每个子类都会重写父类的方法 # 2 定义子类 子类重写父类方法 定义 2 个子类表示不同的警犬 class ArmyDog(Dog): # 2.1 追击犬类 继承狗类 def work(self): print("追击敌人......") class DrugDog(Dog): # 2.2 缉毒犬类 继承狗类 def work(self): print("追查毒品......") # 3 定义人类 class Person(object): def work_with_dog(self, dog): # 定义形参 dog dog.work() # 这里以后传入的 dog 是追击敌人 或 追查毒品的对象, 他们会调用自己的 work 方法 # 4 创建对象, 调用不同的功能, 传入不同的对象,观察执行的结果 daqiu = Person() ad = ArmyDog() dd = DrugDog() daqiu.work_with_dog(ad) # 追击敌人...... 将对象当做形参传入, 传入后 work_with_dog 方法即为 ad.work() ,而 ad 是基于 ArmyDog() 类创建的对象, 调用自己类的 work 方法 daqiu.work_with_dog(dd) # 追查毒品...... ------------------------------------------------ 执行后 C:\Users\马俊南\AppData\Local\Microsoft\WindowsApps\python3.13.exe D:\Pycharm\code\day16\01.多态.py 追击敌人...... 追查毒品...... Process finished with exit code 0
16.5 设置和访问类属性
类属性就是 类对象 所拥有的属性,它被 该类的所有实例对象 所共有
类属性可以使用 类对象 或 实例对象 访问
# 1 定义类 定义类属性 class Dog(object): tooth = 10 # 设置类属性 # 2 创建对象 wangcai = Dog() xiaohei = Dog() # 3 基于类访问类属性 print(Dog.tooth) # 4 基于对象访问对象属性 print(wangcai.tooth) print(xiaohei.tooth) ------------------------------------------------ 执行后 C:\Users\马俊南\AppData\Local\Microsoft\WindowsApps\python3.13.exe D:\Pycharm\code\day16\02.设置和访问类属性.py 10 10 10 Process finished with exit code 0
类属性的优点:
1.记录的某项数据 始终保持一致时,则定义类属性
2.实例属性 要求 每个对象 为其 单独开辟一份内存空间 来记录数据,而 类属性 为全类所共有,仅占用一份内存,更加节省内存空间
16.6 修改类属性
类属性只能通过类对象修改,不能通过实例对象修改,如果通过实例对象修改类属性,表示的是创建了一个实例属性
# 1 定义类 定义类属性 class Dog(object): tooth = 10 # 设置类属性 # 2 创建对象 wangcai = Dog() xiaohei = Dog() # 3 基于类访问类属性 print(Dog.tooth) # 10 默认类属性值 # 4 基于对象访问对象属性 print(wangcai.tooth) # 10 使用默认类属性值 print(xiaohei.tooth) # 10 使用默认类属性值 # 5 基于类修改类属性是永久修改(使用的同一内存空间中的属性值) Dog.tooth = 66 print(Dog.tooth) # 66 xiaohong = Dog() # 基于此类新创建的所有对象, 属性也发生了修改 print(xiaohong.tooth) # 66 (使用的同一内存空间中的属性值) print(xiaohei.tooth) # 66 # 之前创建的对象, 属性也发生了修改 (使用的同一内存空间中的属性值) # 6 基于对象修改对象属性, 只有这个对象中的属性发生了修改 xiaohei.tooth = 88 print(xiaohei.tooth) # 88 # 只有这个对象中的属性发生了修改(新开辟了一处空间存储) print(wangcai.tooth) # 66 print(Dog.tooth) # 66 ------------------------------------------------ 执行后 C:\Users\马俊南\AppData\Local\Microsoft\WindowsApps\python3.13.exe D:\Pycharm\code\day16\03.修改类属性.py 10 10 10 66 66 66 88 66 66 Process finished with exit code 0
16.7 类方法
16.7.1 特点
需要用 装饰器@classmethod 来标识其为类方法,对于类方法,第一个参数必须是类的对象,一般以 cls 作为第一个参数
16.7.2 使用场景
当方法中 需要使用类的对象(如访问私有类属性等)时,定义类方法
类方法一般用类属性配合使用
# 定义类 class Dog(object): __tooth = 10 # 私有类属性 @classmethod # 定义类方法 get_xxx、set_xxx 获取类属性 def get_tooth(cls): # 自动提示形参 cls return cls.__tooth # 创建对象, 调用类方法 wangcai = Dog() print(wangcai.get_tooth()) # 10 ------------------------------------------------ 执行后 C:\Users\马俊南\AppData\Local\Microsoft\WindowsApps\python3.13.exe D:\Pycharm\code\day16\04.类方法.py 10 Process finished with exit code 0
16.8 静态方法
16.8.1 特点
需要通过 装饰器@staticmethod 来进行修饰,静态方法即不需要传递类对象也不需要传递实例对象(形参没有self、cls)
静态方法 也能够通过 实例对象 和 类对象 去访问
16.8.2 使用场景
当方法中 既不需要使用实例对象(如实例对象、实例属性),也不需要使用类对象(如类属性、类方法、创建实例等)时,定义静态方法
取消不需要的参数传递,有利于 减少不必要的内存占用和性能消耗
# 定义类 定义静态方法 class Dog(object): @staticmethod # 定义静态方法 def info(): # 不会弹出形参 self、cls print("狗类, 用于创建狗的实例...") # 创建对象 wangcai = Dog() # 调用对象方法 调用类方法 wangcai.info() # 对象方法 Dog.info() # 类方法 ------------------------------------------------ 执行后 C:\Users\马俊南\AppData\Local\Microsoft\WindowsApps\python3.13.exe D:\Pycharm\code\day16\05.静态方法.py 狗类, 用于创建狗的实例... 狗类, 用于创建狗的实例... Process finished with exit code 0
16.9 面向对象其他总结
1.面向对象三大特性
(1)封装
(2)继承
(3)多态
2.类属性
(1)归属于类对象的属性,所有对象共有的属性
3.实例属性(对于数字不需要变化的属性,定义在类属性中,若定义在对象属性中,定义一个,开辟一个内存空间存放,占用内存高)
4.类方法
class 类名(): @classmethod def 函数名(cls): # 有参数 代码 ......
5.静态方法
class 类名(): @staticmethod def 函数名(): # 无参数 代码 ......
———————————————————————————————————————————————————————————————————————————
无敌小马爱学习