继承
什么是继承?
继承是一种创建新类的方式,在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.龟壳模型
以上是多继承的一些简单知识,如果遇到多继承,可以回忆一些上述图中的顺序,基本可以不犯错.