面向对象的三大特征之一:继承
繼承:
面向對象的編程帶來的主要好處之一是代碼的重用,實現(xiàn)這種重用的方法之一是通過繼承機制。繼承完全可以理解成類之間的類型和子類型關系。需要注意的地方:繼承語法???class?派生類名(基類名)://...?? 基類名寫作括號里,基本類是在類定義的時候,在元組之中指明的。
從類的的層面上,表示‘’什么‘’是‘’什么“”的關系
class Hero:def __init__(self, name, aggresivity, life):self.Name = nameself.Aggresivity = aggresivityself.Life =lifedef attract(self,enemy):enemy.Life -=self.Aggresivity class Riven(Hero):camp ='Noxus' class Garen(Hero):
camp = 'Demacia'
g1=Garen('草叢倫',20,120) r1=Riven('瀟灑哥',30,100)
在該例中,Garen類繼承了Hero類:
用上面的湖來說就是,'Garen是Hero'
?
何時使用繼承:假如我需要定義幾個類,而類與類之間有一些公共的屬性和方法,這時我就可以把相同的屬性和方法作為基類的成員,而特殊的方法及屬性則在本類中定義,這樣只需要繼承基類這個動作,就可以訪問到基類的屬性和方法了,它提高了代碼的可擴展性。
在上面的例子中:把Geren類中的__init__()省略。,通過繼承Hero達到節(jié)省代碼.
繼承:是基于抽象的結果。抽取比較相像的部分(在上面就是對特征的相似,都有名字,生命值,攻擊力)
屬性查找:先從對象的命名空間找》》自己的類的命名空間中找》》》父類中找》》》》
class Foo:def f1(self):print('from Foo.f1')self.f2() #self=b1 self.f2def f2(self):print('from Foo.f2')class Bar(Foo):def f2(self):print('from Bar.f1')b1 = Bar() b1.f1()結果:
from Foo.f1 from Bar.f1? 當b1調用f1的時候,發(fā)現(xiàn)自己沒有,同時自己所在的類中也沒有f1(),就在父類Foo中查找,顯然,Foo中有f1()。所以就運行,結果為from Foo.f1。而接著就是運行self.f2(),在b1 中沒有f2(),但是在對象b1所在的類中有f2(),所以運行結果就是from Bar.f2
?
繼承的 實現(xiàn):
對于在繼承過程中,python會計算出一個方法解析順序(MRO)列表,它是一個簡單的所有基類的線性列表>
class Foo:passclass Aor:passclass Bar(Foo,Aor):passprint(Bar.__mro__)通過__mro__方法可以找出繼承順序:
(<class '__main__.Bar'>, <class '__main__.Foo'>, <class '__main__.Aor'>, <class 'object'>)
MRO列表遵循如下三點:
1.子類優(yōu)先父類被檢查。
2.多個父類會根據(jù)它們在列表中的順序被檢查
3.如果對下一個類存在兩個合法的選擇(遵循2條件)
?
存在多個父類的情況下:
屬性查找方式有:深度優(yōu)先和廣度優(yōu)先。
一般來講,經(jīng)典類在多繼承的情況下會按照深度優(yōu)先的方式查找,新式類會按照廣度優(yōu)先的方式查找.
在python3中都是新式類,因為他們默認繼承object
Bar.__bases__得到父類。
?
在新式類中:
如果,沒有共同的頭部類型
?
查找順序:ClassA>ClassB>ClassC>ClassD>ClassE>ClassF>object
當有共同頭部父類的類型時:
查找順序:ClassA>ClassB>ClassC>ClassE>ClassF>ClassF>ClassG>ClassD>object
?
子類調用父類的方法(內置函數(shù)super):
class People:def __init__(self,name,age,sex):self.name=nameself.age=ageself.sex=sexdef foo(self):print('from parent')class Teacher(People):def __init__(self,name,age,sex,salary,level):#在python3中super().__init__(name,age,sex) #調用父類的__init__的功能,實際上用的是綁定方法,用到了mro表查詢繼承順序,只能調用一個父類的功能#在python2中# super(Teacher,self).__init__(name,age,sex) #super(Teacher,self)是一個死格式self.salary=salaryself.level=leveldef foo(self):super().foo()print('from child')t=Teacher('bob',18,'male',3000,10) print(t.name,t.age,t.sex,t.salary,t.level) t.foo()?
轉載于:https://www.cnblogs.com/z18271397173/p/9127170.html
總結
以上是生活随笔為你收集整理的面向对象的三大特征之一:继承的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: [LeetCode]Integer to
- 下一篇: 3ds max删除了对象后,还是将原来所