面向对象单双继承

什么是继承:

继承是一种创建新类的方式,在python中,新建的类可以继承一个或多个父类,

父类又可称为基类或超类,新建的类称为派生类或子类。

 

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

 

class ParentClass1: #定义父类
    pass

class ParentClass2: #定义父类
    pass

class SubClass1(ParentClass1): #单继承,基类是ParentClass1,派生类是SubClass
    pass

class SubClass2(ParentClass1,ParentClass2): #python支持多继承,用逗号分隔开多个继承的类
    pass
#多继承
class A1:  #父类(<class 'object'>,)
    pass

class A2:  #父类(<class 'object'>,)
    pass

class B1:  #(父类<class 'object'>,)
    pass
class B2(B1,A1,A2): #子类继承了(B1,A1,A2): pass print(B2.__bases__) #B2继承了 __B1__, __A1__, ___A2__ ##class '__main__.B1'>, <class '__main__.A1'>, <class '__main__.A2'>)
(<class 'object'>,)

 

2个类继承一个父类例子:

class an:           #父类共同属性
    def __init__(self,name,aggr,hp):  #方法 动态属性  内置的双下方法       
     self.name = name 对象属性 实例化属性 self.aggr = aggr self.hp = hp def eat(self): ###独立函数 print('in an eat') class Dog(an): #Dog继承了“an”这个类 def __init__(self,kind,name,aggr,hp): self.kind = kind #Dog这个类中单独有的属性 # 派生方法 # super().__init__(name,aggr,hp) # an.__init__(self,name,aggr,hp) def eat(self): print('in dog eat') class peron(an): #peron 这个子类继承了“an”这个父类 def __init__(self,sex,name,aggr,hp): self.sex =sex #派生方法 # super().__init__(name,aggr,hp)
     #单继承 中 super()会寻找父类
    #而且在使super调用父类 方法适合不要再给传self参数
an.__init__(self,name,aggr,hp)
def eat(self): print('in peron eat') alex = peron('男','alex',20,100) # 子类使用名字(方法和静态变量),如果在子类中没有,就使用父类的\                     # Cat('Tom','暹罗猫','猫粮') 实例化                 # 实例化这个类                 #创建一个空对象                 # 执行__init__方法:子类没有用父类的 peron.eat() #调用了peron这个类的 eat()函数 super(peron,alex).eat() an.eat(alex) #调用了an这个父类的 eat()函数 把alex传入进去 print(alex.aggr) print(alex.sex) hei = Dog('咬人','黑',20,1000) print(hei.name) print(hei.kind)

 

 单继承多次 按类的顺序依次集成:

class A:     
def wahaha(self):print('in A')

class B(A): #class B 继承了A
def wahaha(self):print('in B')

class C(B):pass #class C 继承了B
def wahaha(self):print('in C')

class D(C):pass #class D 继承了C
# def wahaha(self):print('in D')

#d = D()
d.wahaha()

 

钻石继承问题 :                                       

 

# coding:utf-8

class A:              #A类

  def wangwang(self):        

     print('in A')

 

class B(A):       #B类继承A

  def wangwang(self):        

     super().wangwang()    # 'in C '      如果C ,D中都找不到 就会找B把 “in B” 打印出来,但是同时有了super,super还会找上级也就是A

     print('in B')

  

class C(A):           #C类也继承A

  def wangwang(self):        

     print('in C')

 

class D(B,C):pass   #D类继承BC类   D类的d.wangwang。没有去B找如果B里面没有去C找 如果全都没有后那就去A找,但是如果其中加了suerp()在有2个或者多个的类里面他会先按光度查找,如果在单个的类里面他会直接先找父级

d = D())          #D()类加括号后赋值给d后 执行这个类名 ,没有了d.wangang  后开始找上一级
d.wangwang()  #找D类中的wangwang()

py3 super
# 单继承中  super就是找父类
# 多继承    super寻找的轨迹是根据mro(广度优先)顺序的

 

 在py3里 所有的多继承问题 都符合 广度优先算法:

 

 

如果一个类 继承了object 这个类就被称为新式类,在2.7中没有继承object类 就被称为经典类。

 度优先 广度优先 都是一种遍历算法,把这个图中所有的项都走一遍,且不会重复

                那么问题又来了,多继承呢?

  • 是否可以继承多个类
  • 如果继承的多个类每个类中都定了相同的函数,那么那一个会被使用呢?

1、Python的类可以继承多个类,Java和C#中则只能继承一个类

2、Python的类如果继承了多个类,那么其寻找方法的方式有两种,分别是:深度优先和广度优先

 

  • 当类是经典类时,多继承情况下,会按照深度优先方式查找
  • 当类是新式类时,多继承情况下,会按照广度优先方式查找

经典类和新式类,从字面上可以看出一个老一个新,新的必然包含了跟多的功能,也是之后推荐的写法,从写法上区分的话,如果 当前类或者父类继承了object类,那么该类便是新式类,否则便是经典类。

 

 

经典类:首先去A类中查找,如果A类中没有,则继续去B类中找,如果B类中么有,则继续去D类中找,如果D类中么有,则继续去C类中找,如果还是

未找到,则报错

 

新式类:首先去A类中查找,如果A类中没有,则继续去B类中找,如果B类中么有,则继续去C类中找,如果C类中么有,则继续去D类中找,如果还是

未找到,则报错

 

经典类 遵循 深度优先算法 且没有mro方法  python2

新式类 遵循 广度优先算法 有mro方法  py2 py3

 

py3 super
# 单继承中  super就是找父类
# 多继承    super寻找的轨迹是根据mro(广度优先)顺序的

 

 

 

  

 

posted @ 2018-03-07 15:48  胸不平$怎平天下  阅读(274)  评论(0编辑  收藏  举报