三大特征

继承

继承方法

class 父类:
    def 父类方法(self):
        方法体

class 子类(父类):
    def 子类方法(self):
        方法体

儿子 = 子类()
儿子.子类方法()
儿子.父类方法()

子类直接拥有父类的方法

class Person:
    def say(self):
        print("说话")

class Teacher(Person):
    def teach(self):
        self.say()
        print("教学")

class Student(Person):
    def study(self):
        self.say()
        print("学习")

qtx = Teacher()
qtx.say()
qtx.teach()

xm = Student()
xm.say()
xm.study()

内置函数

  • isinstance(对象,类型) : 返回指定对象是否是某个类的对象
  • issubclass(类型,类型) : 返回指定类型是否属于某个类型
# 对象 是一种 类型: isinstance(对象,类型)
# 老师对象 是一种 老师类型
print(isinstance(qtx, Teacher)) # True
# 老师对象 是一种 人类型
print(isinstance(qtx, Person)) # True
# 老师对象 是一种 学生类型
print(isinstance(qtx, Student)) # False
# 人对象 是一种 学生类型
print(isinstance(p, Student)) # False
# 类型 是一种 类型: issubclass(类型,类型)
# 老师类型 是一种 老师类型
print(issubclass(Teacher, Teacher)) # True
# 老师类型 是一种 人类型
print(issubclass(Teacher, Person)) # True
# 老师类型 是一种 学生类型
print(issubclass(Teacher, Student)) # False
# 人类型 是一种 学生类型
print(issubclass(Person, Student)) # False
# 是的关系
# 老师对象的类型 是 老师类型
print(type(qtx) == Teacher) # True
# 老师对象的类型 是 人类型
print(type(qtx) == Person) # False

继承数据

子类如果没有构造函数,将自动执行父类的,但如果有构造函数将覆盖父类的。此时必须通过super()函数调用父类的构造函数,以确保父类实例变量被正常创建

class 子类(父类):
    def __init__(self,父类参数,子类参数):
        super().__init__(参数) # 调用父类构造函数
        self.实例变量 = 参数

演示

class Person:
    def __init__(self, name="", age=0):
        self.name = name
        self.age = age

# 子类有构造函数,不会使用继承而来的父类构造函数[子覆盖了父方法,好像它不存在]
class Student(Person):
    # 子类构造函数:父类构造函数参数,子类构造函数参数
    def __init__(self, name, age, score):
        # 调用父类构造函数
        super().__init__(name, age)

        self.score = score

ts = Person("唐僧",22)
print(ts.name)
kw = Student("悟空", 23, 100)
print(wk.name)
print(wk.score)

定义

  • 概念: 重用现有类的功能,并在此基础上进行扩展
  • 说明:子类直接具有父类的成员(共性),还可以扩展新功能

相关知识

  • 父类(基类、超类)、子类(派生类)
  • 父类相对于子类更抽象,范围更宽泛;子类相对于父类更具体,范围更狭小
  • 单继承:父类只有一个(例如 Java,C#)
  • 多继承:父类有多个(例如C++,Python)
  • Object类:任何类都直接或间接继承自 object 类

多继承

一个子类继承两个或两个以上的基类,父类中的属性和方法同时被子类继承下来

  • 同名方法解析顺序(MRO, Method Resolution Order),类自身 --> 父类继承列表(由左至右)--> 再上层父类
   A
  / \
 /   \
B     C
\     /
 \   /
  \ /
   D