python面向对象三大特性之继承多态

Posted 曹艳飞

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了python面向对象三大特性之继承多态相关的知识,希望对你有一定的参考价值。

继承

什么是继承          

  所谓继承指提供了同一类对象共性的处理方法,子类继承父类共性的东西。 这样有利于代码的复用性,即子类拥有父类的方法。通过继承创建的新类称为“子类”或“派生类”,被继承的类称为“基类”、“父类”或“超类”。

  继承可以想象成什么是什么的关系

python中类的继承分为:单继承和多继承

技术分享图片
class Parent1: # 父类1
    pass
class Parent2: #父类2
    pass
class Son1(Parent1):  #单继承,基类是ParentClass1,派生类是Son1
    pass
class Son2(Parent1,Parent2):  #多继承,父类是Parent1和Parent2,派生类是Son2
    pass
技术分享图片

查看继承

技术分享图片
>>> Son1.__bases__ #__base__只查看从左到右继承的第一个父类,__bases__则是查看所有继承的父类
(<class ‘__main__.Parent1‘>,)
>>> Son2.__bases__
(<class ‘__main__.Parent1‘>, <class ‘__main__.Parent2‘>)
如果没有指定基类,python的类会默认继承object类,object是所有python类的基类
>>> Parent1.__bases__
(<class ‘object‘>,)
技术分享图片
技术分享图片

# class Animal:   
# def __init__(self,name,eat,drink,push,shit):
# self.name=name
# self.eat= eat
# self.drink= drink
# self.push= push
# self.shit= shit
# class Dog(Animal):
# def cry(self):
# print(‘%s汪汪汪‘%self.name) #在子类中可以使用父类继承的name
# class Cat(Animal):
# def cry(self):
# print(‘%s喵喵喵‘%self.name)
#
# teddy=Dog(‘泰迪‘,‘吃‘,‘喝‘,‘拉‘,‘撒‘)
# cat1=Cat(‘加菲‘,‘吃‘,‘喝‘,‘拉‘,‘撒‘)
# print(cat1.name) #调用属性无需添加()
# teddy.cry() #调用方法需要添加(),因为方法本质是函数
加菲

泰迪汪汪汪
技术分享图片

在python3中,子类执行父类的方法也可以直接用super方法.

技术分享图片
# class Animal:
#     def __init__(self,name,eat,drink,push,shit):
#         self.name=name
#         self.eat= eat
#         self.drink= drink
#         self.push= push
#         self.shit= shit
#     def run(self):
#         print(‘%s running‘%self.name)
# class Dog(Animal):
#     def cry(self): 
#         super(Dog,self).run()           #super(Dog,self).run() =Animal().run(self)=super().run()     执行父类的方法
#         print(‘%s汪汪汪‘%self.name)
# class Cat(Animal):
#     def cry(self):   
      super().__init()  #执行父类的属性     # print(‘%s喵喵喵‘%self.name) # # teddy=Dog(‘泰迪‘,‘吃‘,‘喝‘,‘拉‘,‘撒‘) # cat1=Cat(‘附近反‘,‘吃‘,‘喝‘,‘拉‘,‘撒‘) # print(teddy.name) # teddy.cry()
技术分享图片

多继承顺序

python3以上(新式类): 广度优先

python2(经典类)   :深度优先

技术分享图片
class A(object):
    def test(self):
        print(‘from A‘)

class B(A):
    def test(self):
        print(‘from B‘)

class C(A):
    def test(self):
        print(‘from C‘)

class D(B):
    def test(self):
        print(‘from D‘)

class E(C):
    def test(self):
        print(‘from E‘)

class F(D,E):
    # def test(self):
    #     print(‘from F‘)
    pass
f1=F()
f1.test()
print(F.__mro__) #只有新式才有这个属性可以查看线性列表,经典类没有这个属性
<class ‘__main__.F‘>, <class ‘__main__.D‘>, <class ‘__main__.B‘>, <class ‘__main__.E‘>, <class ‘__main__.C‘>, <class ‘__main__.A‘>, <class ‘object‘>
#新式类继承顺序:F->D->B->E->C->A #经典类继承顺序:F->D->B->A->E->C #python3中统一都是新式类 #pyhon2中才分新式类与经典类
技术分享图片

 

多态

 什么是多态:相同方法调用,执行不同动作

  向不同的对象发送同一条消息(!!!obj.func():是调用了obj的方法func,又称为向obj发送了一条消息func),不同的对象在接收时会产生不同的行为(即方法)。 也就是说,每个对象可以用自己的方式去响应共同的消息。所谓消息,就是调用函数,不同的行为就是指不同的实现,即执行不同的函数。

技术分享图片
import abc
class Animal(metaclass=abc.ABCMeta): #同一类事物:动物
    @abc.abstractmethod
    def talk(self):
        pass

class People(Animal): #动物的形态之一:人
    def talk(self):
        print(‘say hello‘)

class Dog(Animal): #动物的形态之二:狗
    def talk(self):
        print(‘say wangwang‘)

class Pig(Animal): #动物的形态之三:猪
    def talk(self):
        print(‘say aoao‘)
def func(object)
  object.talk() #我们可以定义一个统一的接口来使用 三个类都有talk的方法



























以上是关于python面向对象三大特性之继承多态的主要内容,如果未能解决你的问题,请参考以下文章

Python 入门 之 面向对象的三大特性(封装 / 继承 / 多态)

python面向对象三大特性之继承多态

面向对象之:三大特性:继承(已讲),封装,多态

《Python》 面向对象三大特性之多态封装

oldboy 21th day. I love Python. 面向对象之封装, 多态, 继承 三大特性

Python 面向对象的三大特性:封装,继承,多态