继承,继承顺序,多态

继承:

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)
 

猜你喜欢

转载自www.cnblogs.com/jiangxiaolong-1996/p/9752604.html