继承
语法
1.代码:
class 子类(父类):
def __init__(self,参数列表):
super().__init__(参数列表)
self.自身实例变量 = 参数
设计角度: 先有子类,再有父类. 抽象化的过程:子(具体,小概念) -> 父(抽象,大概念)
编码角度: 先写父类,再写子类.
2.说明:
-- 子类拥有父类的所有成员。
-- 子类如果没有构造函数,将自动执行父类的,但如果有构造函数将覆盖父类的。此时必须通过super()函数调用父类的构造函数,以确保父类属性被正常创建。
class Person: def __init__(self, name): self.name = name def say(self): print("会说话") class Student(Person): # 如果子类具有构造函数,则没有父类的构造函数. def __init__(self, name, score): self.score = score # 通过super()函数调用父类方法 super().__init__(name) def study(self): print("会学习") class Teacher(Person): def __index__(self,name): super().__init__(name) def teach(self): print("会讲课") s01 = Student("无忌", 100) print(s01.name) print(s01.score) s01.say() s01.study() # 子类对象,直接使用父类方法.(继承语法的体现) p01 = Person("无忌") print(p01.name) # 如果子类没有构造函数,则使用父类的. p01.say() # 父类对象,只能使用自身方法,不能使用子类方法.
多继承
一个子类继承两个或两个以上的基类,父类中的属性和方法同时被子类继承下来。
同名方法的解析顺序(MRO, Method Resolution Order):
类自身 --> 父类继承列表(由左至右)--> 再上层父类
A
/
/
B C
/
/
D
定义
1.重用现有类的功能与概念,并在此基础上进行扩展。
2.说明:
-- 子类直接具有父类的成员(共性),还可以扩展新功能。
-- 事物具有一定的层次、渊源,继承可以统一概念。
例如:公司组织架构
老板
行政中心 营销中心 技术中心
人力资源 行政部 销售部 策划部 研发部 产品部
优点
1.一种代码复用的方式。
2.以层次化的方式管理类。
缺点:耦合度高
作用:隔离客户端代码与功能的实现方式。(抽象(代表)变化点,隔离用与做.)
适用性:多个类在概念上是一致的,且需要进行统一的处理。
相关概念
父类(基类、超类)、子类(派生类)。
父类相对于子类更抽象,范围更宽泛;子类相对于父类更具体,范围更狭小。
单继承:父类只有一个(例如 Java,C#)。
多继承:父类有多个(例如C++,Python)。
Object类:任何类都直接或间接继承自 object 类。
内置函数
isinstance(obj, class_or_tuple)
返回这个对象obj 是否是某个类的对象,或者某些类中的一个类的对象。
# 判断对象是否属于一个类型 print(isinstance(s01, Person)) # true print(isinstance(s01, Teacher)) # false print(isinstance(s01, (Person, Teacher))) # true print(isinstance(s01, Student)) # true # 判断一个类型是否属于另一个类型 print(issubclass(Teacher, Person)) # true print(issubclass(Teacher, Student)) # false print(issubclass(Person, Student)) # false print(issubclass(Person, Person)) # true # 如果判断父子 print(issubclass(Teacher, Person) and Teacher != Person) # true print(issubclass(Teacher, Teacher) and Teacher != Teacher) # false
多态
定义:
父类的同一种动作或者行为,在不同的子类上有不同的实现。(调用父类,执行子类.)
作用:
1.继承将相关概念的共性进行抽象,多态在共性的基础上,体现类型的个性化(一个行为有不同的实现)。
2.增强程序扩展性,体现开闭原则。
重写:
子类实现了父类中相同的方法(方法名、参数),在调用该方法时,实际调用的是子类的方法。(变化点重写。)