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 函数名():  # 无参数
        代码
        ......

———————————————————————————————————————————————————————————————————————————

                                                                                                                         无敌小马爱学习

posted on 2025-10-05 14:15  马俊南  阅读(4)  评论(0)    收藏  举报