继承:
1.什么是继承:一个类通过继承某一个或多个基类,可以调用该基类的所有属性,避免出现重复代码
class Vehicle1:
def __init__(self,name,speed,energy):
self.name = name
self.apeed = speed
self.energy = energy
def run(self):
print('启动')
class Ship(Vehicle1): #在括号内写入一个或多个类,表示继承这些基类
pass #子类内没有任何属性
s1 = Ship('泰坦尼克号','60km/s','0il') #但是可以通过子类调用基类的所有属性
print(s1.name,s1.run())
2.当子类与基类的属性重名时,该如何从子类中调用基类的属性,
class Vehicle:
def __init__(self,name,speed,energy):
self.name = name
self.apeed = speed
self.energy = energy
def run(self): print('启动') class Ship(Vehicle): #在类后面的()内传入要继承的类(可以是多个) def __init__(self,name,speed,energy,place,NNT): #直接调用基类中的属性 self.nnt = NNT self.place = place Vehicle.__init__(self,name,speed,energy) #调用基类属性,调用基类内的构造函数,self.name = name,self.speed = speed,self.energy = energy def run(self): Vehicle.run(self) print('船启动了')
super关键字:
3.当基类的名字发生改变时,所有涉及到基类名的代码都要改变.采用super关键字使得改变代码量减少
class Vehicle1: def __init__(self,name,speed,energy): self.name = name self.apeed = speed self.energy = energy def run(self): print('启动') class Ship(Vehicle1): def __init__(self,name,speed,energy,place,NNT): self.nnt = NNT self.place = place super().__init__(name,speed,energy) def run(self): super().run() #super().run() 的作用与 super(Ship, self).run()一样 print('船启动了') s1 = Ship('泰坦尼克号','60km/s','0il','大西洋',1000) s1.run()
继承顺序:
python3 中的是新式类 可以通过查看MRO列表,解析继承的顺序
代码:
class A: def text(self): print('a') class B(A): # def text(self): # print('b') pass class C(B): # def text(self): # print('C') pass class D(A): # def text(self): # print('d') pass class E(D): # def text(self): # print('E') pass class F(C,E): # def text(self): # print('F') pass F1 = F() #当F1一找到text属性,便会停止寻找,调用该类中的text属性.如果没有找到会一直通过基类找下去,找完为止,没找到就报错 F1.text() print(F.__mro__) #通过查看__mro__ 查看继承中的顺序
多态:
什么是多态:多态来源于继承,指不同的对象调用相同的方法
a = [1,2,3,4,5] #a,b可以理解成为是2个不同的对象 b = 'abcde' res1 = len(a) #a,b2个不同的对象调用了相同的方法,可以理解为产生a,b2对象的类都继承了具有__len__()方法的类 res3 = a.__len__() #a,b调用了len函数也是一种多态的体现,调用len函数实际上是调用了对象的__len__() res2 = len(b) res4 = b.__len__() print(res1,res2) print(res3,res4)
以动物为例子:一个猫类,一个狗类,2个类都继承动物类,so可以调用动物类内的属性
class Animal: def action(self): print('活动') class Cat(Animal): pass class Dog(Animal): pass c1 = Cat()
c1.action() d1 = Dog() #不同的对象调用了相同的方法,基于继承的特性 d1.action()
def action(obj): #将obj.action()函数定义了一个新的函数 return obj.action() #类似于obj.__len__() 与len(obj) action(c1)
action(d1)