面向对象三大核心特点,封装、继承和多态
封裝
封裝其實(shí)是一種思想,將事物狀態(tài)和功能裝進(jìn)一個(gè)容器,那么這個(gè)容器在python中就是類,由這個(gè)類產(chǎn)生的對(duì)象都擁有類的屬性和功能
在面向?qū)ο蟮乃枷胫?#xff0c;推崇將具有某些共同特征的事物歸為一類,那么這些事物就可以看做是這個(gè)類的具象化對(duì)象,但是允許個(gè)體擁有不同的特征
例如:你和我都是人,都具有人的基本功能,那么我們就是人的對(duì)象,我和你的名字可以不一樣,性別可以不一樣,但本質(zhì)上我們都是人類
在前面我們說到,類不是實(shí)實(shí)在在存在的,是一系列擁有相似屬性和功能的事物的抽離。那么在定義類和類的屬性、功能上實(shí)際就是把這些屬性和功能封裝進(jìn)類里面,抽離相似屬性和功能并把它們放到類里,這種思想就是封裝
class Animal:
dog = “”
human = “”
...
def eat(self):
print("enting")
def sleep(self):
print("sleeping")
動(dòng)物類封裝進(jìn)了dog、human等等屬性,封裝了eat、sleep等功能,這些都屬于Animal類共有的一些屬性和功能
?
繼承
?
繼承的概念源于對(duì)現(xiàn)實(shí)事物的模擬,在人類的概念中,人類下面還有女人、男人、小孩、大人等細(xì)分概念,那么女人就是人類的擴(kuò)展,人類概念就是女人概念的爸爸,女人概念除了擁有人類的所有屬性和功能外還多了一個(gè)屬性就是性別,那么女人類和人類就有非常多的相同屬性和功能,回到編程中,這些高度相似或者相同的屬性和功能其實(shí)就是重復(fù)的代碼,繼承的出現(xiàn)就是為了避免重復(fù)寫大量代碼描述兩個(gè)屬性和功能高度重合的類。
例:
class human:
legs = 4
ear = 2
def? eat (self):
pass
class women:
legs =? 4
ear = 2
sex = “”
def eat (self):
pass
由human 和 women 類可以看出,他們有相同的屬性legs、ear和相同的功能eat(),如果在代碼里這么寫代碼將非常冗余,面向?qū)ο笳Z言幾乎都有繼承的思想,如果用繼承來表示上面的代碼將會(huì)是:
class human:
legs = 4
ear = 2
def? eat?(self):
pass
?
class women(human):
sex = ""
這樣的話human就是繼承women,human就是women的父類,women就是human的子類,women既有自己的屬性sex,也擁有父類的所有屬性和功能。
具體實(shí)現(xiàn)和原理見:
多繼承
在python中允許多繼承關(guān)系,一個(gè)類可以同時(shí)繼承多個(gè)類,這樣它就擁有所有父類的屬性和方法
在python2中,沒有繼承任何類的類被稱為經(jīng)典類,默認(rèn)不繼承任何類
在python3中,所有的類默認(rèn)繼承object,這種類被稱為新式類
菱形繼承
a繼承b,c,b,c由同時(shí)繼承d,那么繼承關(guān)系就形成閉環(huán),此時(shí)a擁有的功能和屬性最多,d擁有的功能和屬性最少
菱形繼承會(huì)帶來屬性查找順序的問題,比如a的屬性name是繼承而來的,但不知道是b,c,d哪一個(gè)的,此時(shí)就會(huì)有查找順序,在python2和python中是不一樣的
python2中,是以深度查找為基本原則,即a->b->d->c,一直查找到繼承關(guān)系最深的那一層
python3中,是以廣度查找為基本原則的,即a->b->c->d,先將分支都查找完,最后找最深的那一層
?
多態(tài)
由同一父類派生的不同子類對(duì)象都可以作為參數(shù)傳遞給某個(gè)函數(shù)去執(zhí)行,并產(chǎn)生不同的結(jié)果,這種形態(tài)叫多態(tài)。
例:
class A:
def __init__(self,name):
self.name = name
class B(A):
pass
def pri_name(obj):
print(obj.name)
b1 = B("egon")
b2 = B("owen")
pri_name(b1)
pri_name(b2)
打印結(jié)果:
egon
owen
?
鴨子類型
兩個(gè)不相干的兩個(gè)類的對(duì)象可以將自身作為參數(shù)傳給同一個(gè)函數(shù)去調(diào)用執(zhí)行,這樣的就是鴨子類型,在python里十分推崇鴨子類型,一個(gè)生物不知道它是不是鴨子,但它只要長(zhǎng)得像鴨子,水里游泳像鴨子,那就認(rèn)為它是鴨子
class A:
def __init__(self,name):
self.name = name
self.age = 18
class B:
def __init__(self,name):
self.name = name
self.sex = "female"
def pri_name(obj):
print(obj.name)
b1 = B("egon")
b2 = B("owen")
pri_name(b1)
pri_name(b2)
打印結(jié)果:
egon
owen
?
轉(zhuǎn)載于:https://www.cnblogs.com/dongxixi/p/10759364.html
總結(jié)
以上是生活随笔為你收集整理的面向对象三大核心特点,封装、继承和多态的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 梦到黄金蛇预示着什么
- 下一篇: 015_ICMP专项研究监控