概念
- 如果两个或者两个以上的类具有相同的特征【属性】和行为【成员函数】,我们可以抽取一个类出来,在抽取出来的类中声明公共的部分
- 被抽取出来的类:父类,超类,基类
- 两个或者两个以上的类:子类,派生类
- 他们之间的关系:子类继承自父类 父类派生出子类
- 作用:简化代码,提高了代码的复用性和可维护性
单继承
- 一个子类只能有一个父类,被称为单继承
- 语法:
父类:
class 父类类名(object):
类体【公共部分】
子类:
class 子类类名(父类类名):
类体【子类特有的部分】
- 注意:object是所有类的父类
#定义父类 #注意:如果没有显示的规定父类,则这个类的父类默认为object class Person(object): #成员变量 def __init__(self,name,age): self.name = name self.age = age #成员函数 def show(self): print("父类中的show被调用") @property def age(self): return self.__age @age.setter def age(self,age): self.__age = age #定义子类 class Worker(Person): def __init__(self,name,age): #在子类中调用父类中的构造函数,主要是为了将父类中的现有的成员变量应用到子类中,即父类的引用 #1.super(当前类,self).__init__(属性列表) super(Worker,self).__init__(name,age) #2.父类名.__init__(self,属性列表) #Person.__init__(self,name,age) #3.super().__init__(属性列表) #super().__init__(name,age) #说明:上面三种写法都可以使用,目的是调用父类的构造函数 #定义子类 class Student(Person): def __init__(self,name,age,subject): super().__init__(name,age) def test(self): print("testing") #1.创建父类对象 p = Person("LiSi",10) print(p.name,p.age) #LiSi 10 p.show() #父类中的show被调用 #2.创建子类的对象 w1 = Worker("aaa",1) print(w1.name,w1.age) #aaa 1 w1.show() #父类中的show被调用 #3.子类除了继承父类中的成员变量和成员函数之外,还可以有特有的成员变量和成员函数 s = Student("bob",18,"语文") s.show() #父类中的show被调用 s.test() #testing #4.子类对象可以访问父类中的公共的成员变量和成员函数,反之,父类对象无法访问子类中特有的成员变量和成员函数 p.test() #AttributeError: 'Person' object has no attribute 'test'
总结:
- 继承的特点:
- 子类对象可以直接访问父类中未私有化的属性
- 子类对象可以调用父类中为私有化的成员函数
- 父类对象不能访问子类特有的属性和成员函数
- 继承的优缺点:
- 优点:可以简化代码,减少冗余;可提高代码的可维护性;提高代码的安全性;是多态的前提
- 缺点:在继承关系中,耦合性是比较高的【如果修改父类,子类也随之发生改变】
解释:耦合性和内聚性被用来描述类与类之间的关系,耦合性越低,内聚性越高,说明代码越好
多继承
- 一个子类可以有多个父类,称为多继承
- 注意:不能为了使用某个类中的某些功能,而刻意去实现继承
class Father1(object): def __init__(self,money): self.money = money def play(self): print("play") def func(self): print("func----1111") class Father2(object): def __init__(self,faceValue): self.faceValue = faceValue def eat(self): print("eat") def func(self): print("func----2222") class Child(Father1,Father2): def __init__(self,money,faceValue,hobby): self.hobby = hobby #注意:子类继承多个父类中的成员变量,需要分别调用父类中构造函数 Father1.__init__(self,money) Father2.__init__(self,faceValue) def show(self): print("show") #创建一个子类对象 c = Child(100,100,"打麻将") print(c.money,c.faceValue,c.hobby) #100 100 打麻将 c.play() #play c.eat() #eat c.show() #show c.func() #func----1111 #注意:如果多个父类中存在重名的函数,当子类对象调用的时候,Python在父类列表中从左到右进行搜索