• Python 基础第十九-二十天(继承)


    继承

    什么是继承?

    继承是一种创建新类的方式,在python中,新建的类可以继承一个或多个父类,父类又可称为基类或超类,新建的类称为派生类或子类

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

    复制代码
    class ParentClass1: #定义父类
        pass
    
    class ParentClass2: #定义父类
        pass
    
    class SubClass1(ParentClass1): #单继承,基类是ParentClass1,派生类是SubClass
        pass
    
    class SubClass2(ParentClass1,ParentClass2): #python支持多继承,用逗号分隔开多个继承的类
        pass
    复制代码

    查看继承

    >>> SubClass1.__bases__ #__base__只查看从左到右继承的第一个子类,__bases__则是查看所有继承的父类
    (<class '__main__.ParentClass1'>,)
    >>> SubClass2.__bases__
    (<class '__main__.ParentClass1'>, <class '__main__.ParentClass2'>)

    提示:如果没有指定基类,python的类会默认继承object类,object是所有python类的基类,它提供了一些常见方法(如__str__)的实现。                      

    >>> ParentClass1.__bases__
    (<class 'object'>,)
    >>> ParentClass2.__bases__
    (<class 'object'>,)


    object类
    在python3.x中新建的类,默认已经继承了object类的所有方法

    例:
    class A:
        # def b(self):
        #     print(666)
        pass
    
    a = A()
    
    print(A.__dict__)

    结果;

    {'__module__': '__main__', '__dict__': <attribute '__dict__' of 'A' objects>, '__weakref__': <attribute '__weakref__' of 'A' objects>, '__doc__': None}

    可以看出在这个什么功能都没 有的类中,已经继承了object类的内置方法,这种类在python3中叫做 新式类.

    而这种双下划线的方法叫做魔术方法

    继承中的派生属性和派生方法和super方法的使用

    下面通过一段代码来说明什么是派生属性,什么是派生方法class Animal: #设置父类    def __init__(self,name,hp,ad):

     class Animal:
       def __init__(self,name,hp,ad)
         self.name
    = name self.hp = hp self.ad = ad def eat(self): #设置通用方法,执行后,hp + 20 print('开始吃药') self.hp +=20 class Person(Animal): #设置Animal的子类 def __init__(self,name,hp,ad,sex): # 发现传入的形参要比父类中的公用属性要多,这样接受外部实参 Animal.__init__(name,hp,ad) #此处的语法为添加父类中的属性,与上面设置此形参进行对应.接收到的实参会把子类中没有的属性向上找 self.sex = sex #设置在本地的属性
    又叫派生属性 self.money = 100 #设置的本地默认属性 def attack(self,dog): #设置的本地方法 print('%s 攻击了%s' %(self.name,dog.name)) def eat(self) #设置的本地方法,但是此方法跟父类方法名字相同 super().eat() #出现super,表示向父类进行查找,后面接的是方法名称,表示,向上找eat()方法,并执行 print('%s吃药了' %self.name) self.money -= 50 class Dog(Animal): #设置Animal的子类Dog def __init__(self,name,hp,ad,kind): #接收外部实参的形参,并写入到字典 __init__中 # super(Dog,self).__init__(name,hp,ad) #代替上面Animal.__init__()有两种方式,此为第一种方
         super().__init__(name,hp,ad) #此方式为第二种方式 self.kind =def bite(self,person): #本地方法,又叫派生方法 print('%s 咬了 %s 一口' %(self.name,person.name)) sun = Person('刚太郎',100,35,''='小黑',35,45,'金毛') #对Dog类进行实例化 sun.attack(teddy) #引用本地方法 sun.eat() #此处的eat方法有两步:1.由于在print上面放置了super,所以先执行父类中的eat方法,2.执行后,接着执行本地eat方法的print操作 print(sun.money) # print(sun.hp) teddy.bite(sun) #执行本地方法 teddy.eat() #由于本地类中没有该方法,所以直接去父类中查找,并执行 print(teddy.hp) 结果: 钢太郎攻击了小黑 吃药 钢太郎吃药 50 121 小黑咬了钢太郎 吃药
    56

    总结:以上通过一段代码,我们了解了什么叫派生属性,派生方法.并且了解了super方法的用法.

    多继承的执行顺序

    多继承中有两个经典模型为:钻石模型(4点继承)和龟壳模型(6点继承)

    在新式类中,目前python3中所有object类都是新式类,遵循的多继承是广度模型

    python2中,类是默认没有object类的,这些类叫做经典类,他们遵循的多继承是深度模型

    下面举例看看广度模型的钻石模型和龟壳模型的执行顺序

    如下图

    钻石模型:

    龟壳模型:

    1)一个多继承

    2)两个多继承

     下面看一下python2中经典类的深度继承顺序:

    1.钻石模型

     2.龟壳模型

    以上是多继承的一些简单知识,如果遇到多继承,可以回忆一些上述图中的顺序,基本可以不犯错.

  • 相关阅读:
    python字符串相关的函数
    令人惊奇的gdb和pstack
    map的正确删除方式
    论道
    自动锁
    delete数组引发的core分析
    linux_硬链接和软链接区别
    vmware的卸载
    vmware + opensuse windows如何远程登录到suse上
    [置顶]援引个人新浪博客
  • 原文地址:https://www.cnblogs.com/tom2ling/p/8822874.html
Copyright © 2020-2023  润新知