• <学习笔记>从零开始自学Python-之-基础语法篇(九)类的继承与多态


    1、类的继承

    类的继承,跟人类繁衍的关系相似。
    被继承的类称为基类(也叫做父类),继承而得的类叫派生类(也叫子类),这种关系就像人类的父子关系。
    继承最大的好处是子类获得了父类的全部变量和方法的同时,又可以根据需要进行修改、拓展。
    继承的语法结构是:
    class 子类(父类):

    1.1单继承

    举个例子:下面的代码中。先是定义了一个 People 类,里面有一个 speak 方法。然后再定义一个
    Student 类,并继承自 People 类。

    1. ## 父类定义
    2. class People:
    3. def __init__(self, name, age, weight):
    4. self.name = name
    5. self.age = age
    6. def speak(self):
    7. print(f"{self.name} 说: 我{self.age}岁")
    8. ֺ## 单继承示例
    9. class Student(People):
    10. def __init__(self, name, age, weight, grade):
    11. # 调用父类的实例化方法
    12. People.__init__(self, name, age, weight)
    13. self.grade = grade
    14. #由于继承的机制,Student 实例会拥有 People 类所有属性和方法,比如下边我可以直接调用
    15. People 类的 speak 方法。
    16. xm = Student(name="小明", age=10, weight=50, grade="三年级")
    17. xm.speak()
    18. #小明说:我10岁
    19. 如果不想使用父类的方法,也可以重写它以覆盖父类的 speak 方法。
    20. #重写覆盖父类方法
    21. class Student(People):
    22. def __init__(self, name, age, weight, grade):
    23. # 调用父类的实例化方法
    24. People.__init__(self, name, age, weight)
    25. self.grade = grade
    26. #重写父类的speak方法
    27. def speak(self):
    28. print(f"{self.name} 说: 我{self.age}岁了,我在读{self.grade}")
    29. #此时,再调用的话,就会调用自己的方法了
    30. xm = Student(name="小明", age=10, weight=50, grade="三年级")
    31. xm.speak()
    32. #小明说:我10岁了,我在读三年级

    1.2多继承

    Python 还支持多继承,可以继承自多个类。

    语法格式:

    class 子类(父类1,父类2,父类3....)

     举个例子,定义A、B、C、D、E、F、G七个类,C继承了D,B继承了C,F继承了G,E继承了F,最后A继承了B和E。

    1. #多继承举例
    2. class D:
    3. def showD(self):
    4. print('你看到的是D')
    5. class C(D):
    6. def age(self):
    7. print('c的年龄')
    8. class B(C):
    9. def show(self):
    10. print("你看到的是B")
    11. class G:
    12. def showG(self):
    13. print('你看到的是G')
    14. class F(G):
    15. def showF(self):
    16. print('你看到的是F')
    17. class E(F):
    18. def show(self):
    19. print("你看到的是E")
    20. class A(B, E):pass
    21. a=A()
    22. a.show()
    23. a.showD()
    24. #你看到的是B
    25. #你看到的是D #因为B没有showD这个方法,所以去D中去找

    多继承的顺序使用的是从左向右再深度优先的原则。

    MRO 算法

    上面的继承案例是只是非常简单的一种场景,在实际应用中,会远比这个来得复杂。

    此时如果单纯的将其理解成 从左向右 深度优先 就会发现很场景下想要理清的方法解析顺序(MRO)是非常难的。

    在这种情况下,你还可以有两种方法:

    1. 使用 __mro__ 来查询

    2. 使用 merge算法进行推导

    1. #MRO算法举例
    2. class A(object):pass
    3. class B(A):pass
    4. class C(A):pass
    5. class D(B, C):pass
    6. print(D.__mro__)
    7. #(, , , , )

    2、类的多态

    多态,是指在同一类型下的不同形态。

    1. #类的多态举例
    2. class People:
    3. def speak(self):
    4. pass
    5. class American(People):
    6. def speak(self):
    7. print("Hello, boys")
    8. class Chinese(People):
    9. def speak(self):
    10. print('你好呀,兄弟!')
    11. p1= American()
    12. p2 = Chinese()
    13. def do_speak(people):
    14. people.speak()
    15. do_speak(p1)
    16. do_speak(p2)
    17. #Hello, boys
    18. #你好呀,兄弟!

    3、类的 property 属性

    在之前的学习中,对象的属性,我们都是通过把变量值赋值给对象本身来实现的。

    1. class Student:
    2. pass
    3. s = Student()
    4. s.name = "张三"
    5. s.age = 27

    直接赋值会存在一个问题,就是无法对属性值进行合法性较验,比如我给 age 赋值的是负数,在业 务上这种数据是不合法的。但上面那种写法是无法检查出来的。

    为了实现属性的合法性校验,Python 引入的 property 属性。

    比如把年龄的数据限制在0-100,如果输入-9,就会报错

    1. #类的 property 属性
    2. class Student:
    3. @property
    4. def age(self):
    5. return self._age
    6. @age.setter
    7. def age(self, value):
    8. if 0 <= value <= 100:
    9. self._age = value
    10. else:
    11. raise ValueError("Valid value must be in [0, 100]")
    12. li = Student()
    13. li.name='li'
    14. li.age=-9
    15. print(li.age)
    16. ValueError Traceback (most recent call last)
    17. input-12-5e2d3cfb9ed2> in
    18. 12 li = Student()
    19. 13 li.name=''
    20. ---> 14 li.age=-9
    21. 15 print(li.age)
    22. input-12-5e2d3cfb9ed2> in age(self, value)
    23. 8 self._age = value
    24. 9 else:
    25. ---> 10 raise ValueError("Valid value must be in [0, 100]")
    26. 11
    27. 12 li = Student()
    28. ValueError: Valid value must be in [0, 100]

  • 相关阅读:
    【我的Python日记】- 列表
    2022.8.9考试排列变换--1200题解
    Perl 语言开发(十二):面向对象编程,深入理解与实践
    Codeforces Round #811 (Div. 3)A.B.C.E
    FPGA实现10M多功能信号发生器
    【JavaScript】fetch 处理流式数据,实现类 chatgpt 对话
    【数据结构笔记5】-哈夫曼树
    社区系统项目复盘-3
    如何让一个uniform variable在多级shader中都起作用(类似C语言的全局变量)?
    R语言mgcv包广义可加模型对分类曲线进行拟合
  • 原文地址:https://blog.csdn.net/qq_41597915/article/details/126062008