085 屬性的查找順序

1、屬性的查找順序

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中全是新式類)python

  • 繼承的菱形問題:新式類和經典類的查找順序是不同的
  • 新式類的查找順序:廣度優先---從左側開始,一直往上找,找到菱形的頂點結束(不包括菱形頂點),繼續下一個繼承的父類往上找,找到菱形的頂點結束(不包括菱形頂點),最後找到菱形頂點
  • 經典類的查找順序:只有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'>)code

相關文章
相關標籤/搜索