大家好,欢迎来到IT知识分享网。
继承是面向对象的三大特征之一,也是实现软件复用的重要途径。Python中的继承机制是多继承机制,即一个子类可以同时有多个父类。
1.继承的语法
Python子类继承父类的语法是在定义子类时,将多个父类放在子类之后的圆括号里。语法格式如下:
class 子类名称(父类1,父类2,...): # 类的定义部分
如果在Python中定义一个类时未指定这个类的直接父类,则这个类默认继承object类。因此,object类是所有类的父类,要么是其直接父类,要么是其间接父类。
实现继承的类被称为子类,被继承的类被称为父类,也被称为基类、超类。父类和子类的关系,是一般和特殊的关系,是抽象和具体的关系。从子类角度来看,子类扩展了父类的功能。从父类角度来看,父类派生出了子类。
class People: # 定义类的基本属性 name = '' age = '' # 定义类的私有属性 __weight = 0 # 定义类的构造方法 def __init__(self, name, age, weight): self.name = name self.age = age self.__weight = weight # 定义成员方法 def say(self): print(f'{self.name}说我今年{self.age}岁了') def walk(self): print(f'{self.name}会走路了') # 定义学生继承自People类 class Student(People): # 定义学生类特有属性grade代表年级 grade = '' # 定义学生类的构造方法 def __init__(self, name, age, weight, grade): # 调用父类构造方法 People.__init__(self,name, age, weight) self.grade = grade # 覆写父类的方法 def say(self): print(f'{self.name}说我今年{self.age}岁了,我在读{self.grade}年级') # 定义成员方法 def study(self): print(f'{self.name}说:好好学习,天天向上!') # 实例化学生类 s1 = Student('关羽',35, 80,'三年级') # 调用say()方法 s1.say() # 因为重写了父类方法,所以调用的是子类的say()方法 # 调用walk()方法,因为学生没有walk()方法,但是学生继承了People, 所以会调用父类的walk()方法 s1.walk() # 调用study()方法,因为父类没有study, 子类定义了独有的study方法,会直接调用 s1.study()
2.多继承
绝大多数面向对象语言只支持单继承而不支持多继承,例如C++, Java等。Python虽然在语法上支持多继承,但通常建议如不是特殊情况,则尽量不要使用多继承,这样可以保证编程思路清晰。
当一个子类有多个直接父类时,该子类会继承得到所有父类的公有的方法。但是,如果直接继承的多个父类中有相同的方法时,Python会按照继承的父类的前后顺序,前面类中的方法会“屏蔽”后面父类中的同名方法。所以,对于子类和直接继承的父类的同名方法查找有顺序是:
子类 -> 直接子类(类1,类2,类3,...类n) 从左到右搜索,找到了就屏蔽后面的同名方法。
class Human: def __init__(self, name, age, gender, skin): self.name = name self.age = age self.gender = gender self.skin = skin def walk(self): print(f'{self.name}正在走路') def work(self): print(f'{self.name}工作了') class Man(Human): def __init__(self, name, age, gender, skin, hair, mouth): Human.__init__(self, name, age, gender,skin) self.hair = hair self.mouth = mouth def work(self): print(f'我是男人,我要养家糊口') def game(self): print(f'我喜欢打游戏') class Woman(Human): def __init__(self, name, age, gender, skin, hair, mouth): Human.__init__(self, name, age, gender, skin) self.hair = hair self.mouth = mouth def work(self): print(f'我是女人,我也要工作') def cook(self): print(f'我会做饭') class Son(Man, Woman): def __init__(self, name, age, gender, skin, hair, mouth, grade): Man.__init__(self, name, age, gender,skin,hair,mouth) self.grade = grade def study(self): print('好好学习,天天向上') # 实例化儿子类 s1 = Son('司马光',9,'男','白皮肤','黑头发','大嘴','三年级') s1.study() # 调用自己独有方法 s1.work() # 父类Man和Woman都有的方法,从左到右找,找到后后面父类中的同名方法会隐藏 s1.game() # 父类Man的独有方法,继承过来 s1.cook() # 父类Woman的独有方法,继承过来 s1.walk() # 子类,直接父类都没有的方法,从父类的父类间接继承,因此继承具有传递性
3.方法重写
如果子类继承的父类的方法功能不能满足需求,可以在子类中重写父类中的同名方法:
class Animal: def say(self): print('动物在说话') class Bird(Animal): def say(self): print('小鸟在唱歌') class Wolf(Animal): def say(self): print('老狼在嚎叫') # 实例化鸟的实例 b = Bird() b.say() # 子类重写了父类方法 # 实例化狼的实例 w = Wolf() w.say() # 子类重写了父类方法 super(Bird, b).say() #用于调用父类中的方法 super(Wolf, w).say() #用于调用父类中的方法
下篇文章将详细介绍super关键字的使用
免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://yundeesoft.com/159931.html