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.龟壳模型

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

 

posted @ 2018-04-13 20:23  tom2ling  阅读(206)  评论(0编辑  收藏  举报