zoukankan      html  css  js  c++  java
  • Python面向对象之类的继承(2)

    1、除了封装,Python面向对象还有继承这一功能,如下代码,这是简单的继承功能.

    class Animal:
    
        def chi(self):
            print(self.name+' 吃')
        def he(self):
            print(self.name + ' 喝')
    
    class Cat:
        def __init__(self, name):
            self.name = name
        def jiao(self):
            print('瞄')
    class Dog(Animal):#继承Animal这个父类,拥有父类的方法
        def __init__(self, name):
            self.name = name
        def jiao(self):
            print(self.name+'汪')
    
    Jay = Dog('name')
    Jay.chi()#这里就可以调用父类里面的方法
    

      如果子类和父类都有相同的一个方法,会默认执行子类的方法

    /2、

    2、Python里面也可以同时继承多个父类,继承方法的优先级是先找自己的方法,然后先左后右

    #Python里面一个类可以同时继承多个类,java,C#里面是不可以的
    class Animal:
        def chi(self):
            print(self.name+' 吃')
        def she(self):
            print(self.name + ' 爱喝')
    class god:
        def shit(self):
            print('shit')
        def she(self):
            print('黄赌毒')
    # class Cat:
    #     def __init__(self, name):
    #         self.name = name
    #     def jiao(self):
    #         print('瞄')
    class Dog(Animal,god):
        '''如果方法重复,优先从自己这里寻找,如果方法在两个父类重复
        例如这里的she方法,这里默认是左边的父类优先,先在左边父类的寻找
        she方法,没有再去下一个父类寻找
        '''
        def __init__(self, name):
            self.name = name
        def he(self):
            print(self.name + ' 不爱喝')
        def jiao(self):
            print(self.name+'汪')
    Jay = Dog('Jay')
    Jay.she()#多个父类的方法继承是先左后右,这里会打印出Jay 爱喝
    

      在Python3的类的继承里面,是深度优先的,如下面代码

    class Jay(object):
        def f1(self):
            print('Jay')
    class A(Jay):
        def f(self):
            print('A')
    class B(Jay):
        def f1(self):
            print('B')
    class C(A):
        def f(self):
            print('C')
    class D(B):
        def f(self):
            print('D')
    class E(C,D):
        def f(self):
            print('E')
    obj = E()
    '''在Python3类的继承里面是广度优先的,这里调用f1的方法,会先在E自身里面寻找
    ,然后接着在C类里面寻找,还是找不到的话会在C的父类A类里面寻找,还找不到就轮
    到去D类里面寻找,这里A类B类都继承了Jay这个基类,但是最后才会去Jay里面寻找f1
    这个方法,也就是在D和B都找不到f1方法之后才会去Jay类里面寻找,这是广度优先的
    体现 ''' obj.f1()#这里输入结果是B

      顺序如图所示

    /3

     3、多态,Python本身支持多态

    #多态,就是多种形态
    
    class Foo:
        def f1(self):
            print('Foo')
    class Bar:
        def f1(self):
            print('Bar')
    def func(arg):#这里显示arg的多种形态,可以是Foo类对象,也可以是Bar类的对象
        arg.f1()
    f=Foo()
    e=Bar()
    func(f)#默认参数给的什么就是什么,没有就报错
    func(e)
    

      

     4、如果子类和父类都有构造函数,那么可以有两种方法可以继承

    class A:
        def __init__(self):
            print('A的构造方法')
            self.name='佳鹏'
            self.height = '1.65'
    class B(A):
        def __init__(self):
            print('B的构造方法')
            self.age = 23
            super(B,self).__init__()#先执行父类的构造方法,再执行自己
    b =B()#这样b也有了A的属性
    print(b.__dict__)
    

      结果如图所示

    还有一种方法是这样

    class A:
        def __init__(self):
            print('A的构造方法')
            self.name='佳鹏'
            self.height = '1.65'
    class B(A):
        def __init__(self):
            print('B的构造方法')
            self.age = 23
            A.__init__(self)#执行父类的构造函数,把B的实例传进去
    b =B()#这样b也有了A的属性
    print(b.__dict__)
    

      结果是一样的。

    5、在Python2里面,有经典类和新式类之分,下面的图是Python2里面默认的经典类

    这里输出的是A,这一种彻底的深入优先,而在Python3里面,由于B类C类都继承A,所以在先找B再找C,最后找A

    在Python2里面还有一个新式类,如图,这里在A类那里继承了个object,这里的继承和Python3一样

    这里输出的是C

    如图是总结

  • 相关阅读:
    记一次线上OOM问题分析与解决
    理解JAVA内存模型
    SpringBoot+Shiro+JPA+LayUI的后台管理系统
    学会使用BeanUtils,提高你的开发效率
    一篇文章教你快速上手接口管理工具swagger
    js 多维数组转一维数组(根据字段展示)
    记一次阿里云服务器中部署egg遇到的问题 (docker vim)
    react 封装tab组件
    js 添加 好玩的注释
    js 下载文件流
  • 原文地址:https://www.cnblogs.com/xiaobeibei26/p/6433129.html
Copyright © 2011-2022 走看看