類的繼承和實現原理
阿新 • • 發佈:2018-09-17
類的繼承 self. base ict pass nbsp class 輸出結果 ase
1.類的繼承實例
class Hero: aa = ‘11‘ def __init__(self, name, life, damage): self.name = name self.life = life self.damage = damage def attack(self, enemy): enemy.life -= self.damage class Hero1(Hero): pass st1 = Hero1(‘gaohui‘, ‘100‘, 50) print(st1.__dict__) print(Hero1.__bases__) print(st1.aa) 輸出結果為: {‘name‘: ‘gaohui‘, ‘life‘: ‘100‘, ‘damage‘: 50} (<class ‘__main__.Hero‘>,) 11
類的繼承中一個易錯點
當父類和子類中有相同的方法時,誰的對象調就是誰的方法
class Foo: def f1(self): print(‘from Foo.f1‘) def f2(self): print(‘from Foo.f2‘) self.f1() # 哪個對象調就是對象的f1 ,所以這個方法就是b的f1class Bar(Foo): def f1(self): print(‘from Bar.f2‘) b = Bar() b.f2() 輸出結果: from Foo.f2 from Bar.f2
繼承的實現原理
當類是新式類時,在多繼承時,查找的屬性不存在時,會按廣度優先(即不會先找到父類)去找。
class A(object): def test(self): print(‘from A‘) class B(A): def test(self): print(‘from B‘) classC(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): pass print(F.mro()) # 得出廣度優先選擇的順序 結果 [<class ‘__main__.F‘>, <class ‘__main__.D‘>, <class ‘__main__.B‘>, <class ‘__main__.E‘>, <class ‘__main__.C‘>, <class ‘__main__.A‘>, <class ‘object‘>]
類的繼承和實現原理