1. 程式人生 > >繼承||派生||繼承實現原理

繼承||派生||繼承實現原理

foo 顯示 elf 圖片 pytho 關系 pre rom init

繼承

繼承:是類與類之間的關系

class ParentClass1: # 父類,基類,超生類
    pass

class ParentClasss2:
    pass

class SubClass1(ParentClass1): #子類,派生類
    pass

class SubClass2(ParentClass1,ParentClasss2):
    pass

# print(SubClass1.__bases__) #查看所繼承的父類
# print(SubClass2.__bases__)

屬性查找聯系

#在查找屬性的時候,顯示從對象裏面尋找,之後去類中尋找,最後去父類中尋找
class Foo: def f1(self): print("from Foo.f1") def f2(self): print("from Foo.f2") self.f1() # b.f1() class Bar(Foo): def f1(self): print("frm Bar.f1") b = Bar() b.f2()

派生

#派生:在查找屬性的時候,顯示從對象裏面尋找,之後去類中尋找,最後去父類中尋找
class Hero:
    def __init__(self,name,damage,zing):
        self.name 
= name self.damage = damage self.zing = zing def attack(self,enemy): enemy.zing -= self.damage class Yang(Hero): def attack(self,enemy): print("from Yang Class") pass class Lin(Hero): pass g1 = Yang(楊學偉,10,100) r1 = Lin(林書行,100,200) g1.attack(r1)

繼承的實現原理

python2中類主要分為兩種

  • 新式類
  • 經典類

在python2中經典類:只要沒有繼承object的類,以及其他的子類都成為經典類

class Foo:
    pass

class Bar(Foo):
    pass

在python2中新式類:只要繼承object的類,以及其他的子類都成為新式類

class Foo(object):
    pass

class Bar(Foo):
    pass

python3中的類只有一種新式類

#在python3中=》新式類:一個類沒有繼承object的類,默認就繼承object
class Foo:
    pass
print(Foo.__bases__)

驗證多繼承下的屬性查找

class A:
    def test(self):
        print("from A")

class B(A):
    def test(self):
        print("from B")

class C(A):
    def test(self):
        print("from C")

class D(B):
    def test(self):
        print("from D")

class E(C):
    def test(self):
        print("from E")

class F(D,E):
    def test(self):
        print("from F")
    pass

f = F()
f.test()
#查找的順序是F-D-B-E-C-A

總結:

經典類的查找屬性的方法是深度優先

技術分享圖片

新式類的查找屬性的方法是廣度優先

技術分享圖片

繼承||派生||繼承實現原理