085 属性的查找顺序

一、属性的查找顺序

1.1 如何重用父类的属性

  • 对象所在的类继承父类的属性

1.2如何重用父类的方法

  • 对象所在的类继承父类的方法

1.3 单继承

class Person(object):
    school = 'oldboy'

    def __init__(self, name, age):
        self.name = name
        self.age = age


class Teacher(Person):
    pass


class Student(Person):
    pass
stu1 = Student()#报错,因为父类中必须传两个参数
  • 这样实例化对象时会报错的,因为我们之前学过对象的属性查找顺序是先从对象自己开始找,然后去它的类中找,并且我们在实例化对象的时候是自动触发对象所在类的init方法的,这里我们的这个student类虽然没有init方法,那这个时候就是我们说的在继承中属性的查找顺序了
  • 先是去对象自己的属性里找--->类里面找--->父类里去找-->找不到报错

1.4 多层继承

class A:
    a="AAAA"
    
class B(A):
    a="BBB"

class C(B):
    a="CCC"
    pass

class D(C):
    a = "DDD"
    pass

1.5 多继承

  • 一个类继承多个父类,子类(父类1,父类2,父类3)
class A:
    a="AAAA"
    pass
class B:
    a="BBB"
    pass

class C:
    a="CCC"
    pass

class D(A,B,C):
    a = "DDD"
    pass

1.6 多继承的多层

1.6.1 继承的菱形问题

菱形问题(显示的都继承一个类,不是object类(py3中全是新式类)

  • 继承的菱形问题:新式类和经典类的查找顺序是不一样的
  • 新式类的查找顺序:广度优先---从左侧开始,一直往上找,找到菱形的顶点结束(不包括菱形顶点),继续下一个继承的父类往上找,找到菱形的顶点结束(不包括菱形顶点),最后找到菱形顶点
  • 经典类的查找顺序:只有python2中才有经典类,深度优先(包括菱形---从左侧开始,一直往上找,找到菱形的顶点结束顶点)继续下一个继承的父类往上找,找到菱形的顶点结束(不包含菱形定点)
class A:
    a = 1
    pass

class B(A):
    a = 2
    pass

class C(A):
    a= 3
    pass

class D(A):
    a = 4
    pass

class E(B):
    a = 5
    pass

class F(C):
    a = 6
    pass

class G(F,E,D):
    a = 7
    pass

a= G
print(a.a)

1.6.2 不出现菱形问题

  • 正常顺序找

1.6.3 __mro__来看查找顺序

  • 是字类的继承父类的查找顺序
print(G.__mro__)

(<class 'main.G'>, <class 'main.F'>, <class 'main.C'>, <class 'main.E'>, <class 'main.B'>, <class 'main.D'>, <class 'main.A'>, <class 'object'>)

猜你喜欢

转载自www.cnblogs.com/xichenHome/p/11439155.html