继承
什么是继承?就是一个派生类(derived class)继承基类(base class)的字段和方法。一个类可以被多个类继承;在python中,一个类可以继承多个类。
父类可以称为基类和超类,而子类可以称为派生类
在继承中可分为单继承和多继承两种
下面是继承的用法,语法为'class 子类的名字(父类名):'
class Plane: #定义一个所有战机的父类 def __init__(self,name,speed,hp,atk): self.name = name self.speed = speed self.hp = hp self.atk = atk class Fighter(Plane): #定义一个Fighter类 它继承的是Plane类 def __init__(self,name,speed,hp,atk,money): self.name = name self.speed = speed self.hp = hp self.atk = atk self.money= money def Attack(self,enemyFighter): enemyFighter.hp -= self.atk class EnemyFighter(Plane): #定义一个EnemyFighter类 它继承的是Plane类 def __init__(self,name,speed,hp,atk,type): self.name = name self.speed = speed self.hp = hp self.atk = atk self.type = type def EnemyAttack(self,fighter): fighter.hp -= self.atk
我们如果想知道一个类的父类是谁,可以使用__bases__方法查看
print(Plane.__bases__) #(<class 'object'>,) print(Fighter.__bases__) #(<class '__main__.Plane'>,) print(EnemyFighter.__bases__) #(<class '__main__.Plane'>,)
可以从结果看出两个子类都继承了Plane这个父类,而Plane类它继承的是类的'祖宗'object类。在一个python3里所有的类都有父类,如果一个类它没有发生继承那么它的父类就是object的子类。
新式类:没有继承父类默认继承object类
抽象的概念
抽象就是抽取类似或比较像的部分
分为两个层次:将两个比较相似的对象比较像的部分抽取成类和把多个类比较像的部分抽取成父类
继承是基于抽象的结果,通过编程语言去实现它,肯定是先经历抽象这个过程,才能通过继承的方式表达出抽象的结构;且类与类之间才有继承的关系
单继承
我们在写上面的代码时候可以发现Fighter类和EnemyFighter类中有很多属性在父类都是重复的,并且有些属性又是自己特有的,那么对于这个派生类特有的属性我们称为派生属性。下面我们修改我们上面的代码:
class Plane: #定义一个所有战机的父类 def __init__(self,name,speed,hp,atk): self.name = name self.speed = speed self.hp = hp self.atk = atk class Fighter(Plane): #定义一个Fighter类 它继承的是Plane类 def __init__(self,name,speed,hp,atk,money): Plane.__init__(self,name,speed,hp,atk) #这里的self是Fighter的self self.money= money #派生属性 def Attack(self,enemyFighter): enemyFighter.hp -= self.atk class EnemyFighter(Plane): #定义一个EnemyFighter类 它继承的是Plane类 def __init__(self,name,speed,hp,atk,type): Plane.__init__(self,name,speed,hp,atk) #这里的self是EnemyFighter的self self.type = type #派生属性 def EnemyAttack(self,fighter): fighter.hp -= self.atk f1 = Fighter('player1',150,1000,100,500) print(f1.__dict__) #{'name': 'player1', 'speed': 150, 'hp': 1000, 'atk': 100, 'money': 500} Boss1 = EnemyFighter('AKS-89',50,3000,500,'BOSS') print(Boss1.__dict__) #{'name': 'AKS-89', 'speed': 50, 'hp': 3000, 'atk': 500, 'type': 'BOSS'}
现在给Plane类添加一个方法Attack,当如果子类和父类的方法重名时,在子类在调用的时候,如果子类中有这个名字那么就一定是用子类的,子类没有才找父类的,如果父类没有就报错
class Plane: #定义一个所有战机的父类 def __init__(self,name,speed,hp,atk): self.name = name self.speed = speed self.hp = hp self.atk = atk def Attack(self): print(self.name+'发射子弹!') class Fighter(Plane): #定义一个Fighter类 它继承的是Plane类 def __init__(self,name,speed,hp,atk,money): Plane.__init__(self,name,speed,hp,atk) #这里的self是Fighter的self self.money= money #派生属性 def Attack(self,enemyFighter): enemyFighter.hp -= self.atk print('Now {0} hp : {1}'.format(enemyFighter.name,enemyFighter.hp)) class EnemyFighter(Plane): #定义一个EnemyFighter类 它继承的是Plane类 def __init__(self,name,speed,hp,atk,type): Plane.__init__(self,name,speed,hp,atk) #这里的self是EnemyFighter的self self.type = type #派生属性 def EnemyAttack(self,fighter): fighter.hp -= self.atk print('Now {0} hp : {1}'