小白學(xué)Python之第十一天

類(class)和實(shí)例(instance)

舉例:以student類為例

1.在Python中绿聘,定義類是通過class關(guān)鍵字來定義的嗽上,class后面緊跟的是類名,即Student類熄攘,類名通常是大寫字母開頭兽愤,后面是(object),表明該類是從哪個(gè)類繼承下來的挪圾。如果沒有合適的繼承類浅萧,就使用object類,這是所有類最終都會繼承的類哲思。

2.定義好了Student類洼畅,就可以根據(jù)Student類來創(chuàng)建出Student的實(shí)例,創(chuàng)建實(shí)例是通過類名+()實(shí)現(xiàn)的:

說明:變量bart指向的就是一個(gè)Student的實(shí)例棚赔,后面的

是內(nèi)存地址帝簇,每個(gè)object的地址都是不一樣的,而Student本身則是一個(gè)類

可以自由的給一個(gè)實(shí)例變量綁定屬性靠益,比如丧肴,給實(shí)例bart綁定一個(gè)name屬性:

由于類可以起到模板的作用,所以在創(chuàng)建實(shí)例的時(shí)候胧后,把一些我們認(rèn)為必須綁定的屬性強(qiáng)制填寫進(jìn)去芋浮,通過定義一個(gè)特殊的__init__方法,在創(chuàng)建實(shí)例的時(shí)候壳快,就把name,score等屬性綁上去:

說明:__init__方法的第一個(gè)參數(shù)永遠(yuǎn)是self途样,表示創(chuàng)建的實(shí)例本身,因此濒憋,在__int__方法內(nèi)部何暇,就可以把各種屬性綁定到self,因?yàn)閟elf就指向創(chuàng)建的實(shí)例本身凛驮。

有了__init__方法裆站,在創(chuàng)建實(shí)例的時(shí)候,就不能傳入空的參數(shù),必須傳入與__init__方法匹配的參數(shù)宏胯,但self不需要傳羽嫡,Python解釋器自己會把實(shí)例變量傳進(jìn)去,

和普通函數(shù)相比肩袍,在類中定義的函數(shù)只有一點(diǎn)不同杭棵,就是第一個(gè)參數(shù)永遠(yuǎn)是實(shí)例變量self,并且氛赐,在調(diào)用時(shí)魂爪,不用傳遞該參數(shù),除此之外艰管,類的方法與普通函數(shù)沒有射門區(qū)別滓侍,所以仍然可以使用默認(rèn)參數(shù),可變參數(shù)牲芋,關(guān)鍵字參數(shù)和命名關(guān)鍵字參數(shù)撩笆。

數(shù)據(jù)封裝及訪問限制

生活化的封裝:我們在使用電視機(jī)時(shí),不用知道電視機(jī)里的具體細(xì)節(jié)缸浦,只需要再用的時(shí)候夕冲,按下遙控器就可以了,這是功能的封裝裂逐。

在使用支付寶時(shí)耘擂,不用知道支付寶的接口以及后臺出路數(shù)據(jù)的能力,只需要掃碼就可以了絮姆,這是方法的封裝。

封裝的意義:

封裝不是單純意義上的隱藏

封裝數(shù)據(jù)的主要原因是保護(hù)隱私

封裝方法的主要原因是隔離復(fù)雜度

在編程里秩霍,對外提供接口篙悯,表示這個(gè)接口的函數(shù),通常稱為接口函數(shù)铃绒。

封裝分為兩個(gè)層面:

第一層面:創(chuàng)建類和對象時(shí)鸽照,分別創(chuàng)建兩者的名稱空間,只能通過類名加“.”或obj.的方式訪問里面的名字

第二層面:類中把某些屬性和方法隱藏起來颠悬,或定義為私有矮燎,只在類的內(nèi)部使用,在類的外部無法訪問赔癌,或者留下少量的接口(函數(shù))訪問诞外。

在python中,使用雙下劃線的方式實(shí)現(xiàn)隱藏屬性(設(shè)置為私有屬性)

舉例

用定義的創(chuàng)建一個(gè)老師t1和一個(gè)學(xué)生s1

分別調(diào)用老師和學(xué)生的姓名和年齡等特征:

返回以下信息

調(diào)用老師的教書技能和學(xué)生的學(xué)習(xí)技能

返回信息如下

把這兩類的一些屬性隱藏下灾票,

在次創(chuàng)建老師和學(xué)生實(shí)例

調(diào)用老師和學(xué)生特征:

然后返回時(shí)出錯(cuò)了

在調(diào)用老師和學(xué)生的技能

返回如上峡谊,還是能正常返回的。

如何用外部代碼獲取隱藏信息

可以給Student類增加get_name和get_age或get_course

外部修改代碼再給Student類增加set_age方法,可以對參數(shù)檢查既们,避免傳入無效的參數(shù)濒析。

注意:

1.在Python中變量名類似__xxx__的,也就是使用這種方法以雙下劃線開頭啥纸,并且以雙下劃綫結(jié)尾的号杏,是特殊變量,特殊變量是可以直接訪問的斯棒,不是private變量盾致,所以不能用__name__、__age__這樣的變量名船。

2.以一個(gè)下劃線開頭的實(shí)例變量名绰上,比如_name,這樣的實(shí)例變量外部是可以直接訪問的渠驼,但是我們會默認(rèn)為是私有變量蜈块,不隨便訪問。

3.雙劃線開頭的實(shí)例變量可以通過以下方式訪問迷扇。但不建議這么干百揭,因?yàn)椴煌姹緋ython解釋器可能會把__age改成不同的變量名

先看看t1,s1的名稱空間

從返回來看,名稱空間名字變了蜓席。那我們來訪問名稱空間的key?

從返回來看器一,我們可以通過‘_類名__屬性’的方式來訪問其內(nèi)部屬性值

和靜態(tài)語言不同,Python允許對實(shí)例變量綁定任何數(shù)據(jù)厨内,也就是說祈秕,對于兩個(gè)實(shí)例變量,雖然他們都是同一類的不同實(shí)例雏胃,但擁有的變量名稱都可能不同请毛。

繼承和多態(tài)

繼承

在OOP程序設(shè)計(jì)時(shí),當(dāng)我們定義一個(gè)class的時(shí)候瞭亮,可以從現(xiàn)有的class繼承方仿,新的class稱為子類,而被繼承的class稱為基類统翩、父類或超類(Base class仙蚜、Super class)

舉例:我們已經(jīng)編寫了一個(gè)名為Father的class,有一個(gè)walk()方法可以直接打映Ш埂:

當(dāng)我們需要編寫B(tài)igson和Twoson類時(shí)委粉,就可以直接從Father類繼承:

對于Bigson來說,F(xiàn)ather就是父類娶桦,對于Father來說艳丛,Bigson是它的子類匣掸。

繼承的優(yōu)點(diǎn)就是子類可以獲得父類的全部功能,

由于Father實(shí)現(xiàn)了walk()方法氮双,因此Bigson和Twoson作為它的父類也獲得了這種方法

運(yùn)行結(jié)果如下:

第二個(gè)好處就是修改下代碼就可以實(shí)現(xiàn)有自己特點(diǎn)的walk()方法碰酝。

再次運(yùn)行

運(yùn)行結(jié)果就有自己的特點(diǎn)了。

多態(tài)

當(dāng)子類和父類都存在walk()的方法時(shí)戴差,子類的walk()會覆蓋父類的walk()送爸,在代碼運(yùn)行的時(shí)候,總是會調(diào)用子類的walk()暖释。

這樣袭厂,就得出了繼承的另一個(gè)好處:多態(tài)

我們在定義class的時(shí)候,其實(shí)可以理解為我們定義了一個(gè)數(shù)據(jù)類型球匕。

判斷一個(gè)變量是否是某個(gè)類型可以用isinstance()判斷:

但是可以試試

返回結(jié)果來看纹磺,c不只是Bigson還是Father。

可以理解亮曹,因?yàn)锽igson是從Father繼承下來的橄杨,所以是Bigson必定也是Father,但反過來就不行了。

多態(tài)的第二個(gè)優(yōu)點(diǎn)就是

一個(gè)接受父類賦值的函數(shù)照卦,可以接受子類的賦值式矫,并且不用做修改就可直接執(zhí)行。

對于我們賦值的變量役耕,我們只知道它是父類類型采转,無需確切知道它的子類型,都可以調(diào)用相同的方法瞬痘,而具體調(diào)用的某種方法作用在父類或哪個(gè)子類上故慈,由運(yùn)行的該對象的確切類型決定,這就是多態(tài)的威力:調(diào)用方只管調(diào)用框全,不管細(xì)節(jié)察绷,當(dāng)新增一種子類時(shí),只要確保方法編寫正確竣况,不用管原來的代碼是如何調(diào)用的,這就是著名的“開閉”原則:

對擴(kuò)展開放:允許新增子類

對修改封閉:不需要父類就可執(zhí)行的函數(shù)

繼承可以一級一級傳下去筒严,任何類都可追溯到根類object丹泉。

靜態(tài)語言 vs 動態(tài)語言

對于靜態(tài)語言(e.g JAVA)來說,如果傳入Father類型鸭蛙,則傳入的對象必須是Father類型或它的子類摹恨,否則,將無法調(diào)用walk()方法

對于Python這樣的動態(tài)語言來說娶视,則不一定需要傳入Father類型晒哄,我們只需要傳入的對象有一個(gè)walk()方法就可以了睁宰。

這就是動態(tài)語言的“鴨子類型”,它并不需要嚴(yán)格的繼承體系寝凌,一個(gè)對象只要看起來“看起來像鴨子柒傻,走起路來像鴨子”,那它就可以被看做鴨子较木。

Python的“file-like object”就是一種鴨子類型红符,對真正的文件對象,它有一個(gè)read()方法伐债,返回內(nèi)容预侯,但是,許多對象峰锁,只要有read()方法都被看做是“file-like object”萎馅,你不一定要傳入真正的文件對象,完全可以傳入任何實(shí)現(xiàn)了read()方法的對象虹蒋。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末糜芳,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子千诬,更是在濱河造成了極大的恐慌耍目,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,743評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件徐绑,死亡現(xiàn)場離奇詭異邪驮,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)傲茄,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,296評論 3 385
  • 文/潘曉璐 我一進(jìn)店門毅访,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人盘榨,你說我怎么就攤上這事喻粹。” “怎么了草巡?”我有些...
    開封第一講書人閱讀 157,285評論 0 348
  • 文/不壞的土叔 我叫張陵守呜,是天一觀的道長。 經(jīng)常有香客問我山憨,道長查乒,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,485評論 1 283
  • 正文 為了忘掉前任郁竟,我火速辦了婚禮玛迄,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘棚亩。我一直安慰自己蓖议,他們只是感情好虏杰,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,581評論 6 386
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著勒虾,像睡著了一般纺阔。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上从撼,一...
    開封第一講書人閱讀 49,821評論 1 290
  • 那天州弟,我揣著相機(jī)與錄音,去河邊找鬼低零。 笑死婆翔,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的掏婶。 我是一名探鬼主播啃奴,決...
    沈念sama閱讀 38,960評論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼雄妥!你這毒婦竟也來了最蕾?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,719評論 0 266
  • 序言:老撾萬榮一對情侶失蹤老厌,失蹤者是張志新(化名)和其女友劉穎瘟则,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體枝秤,經(jīng)...
    沈念sama閱讀 44,186評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡醋拧,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,516評論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了淀弹。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,650評論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡薇溃,死狀恐怖菌赖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情沐序,我是刑警寧澤琉用,帶...
    沈念sama閱讀 34,329評論 4 330
  • 正文 年R本政府宣布,位于F島的核電站策幼,受9級特大地震影響邑时,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜垄惧,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,936評論 3 313
  • 文/蒙蒙 一刁愿、第九天 我趴在偏房一處隱蔽的房頂上張望绰寞。 院中可真熱鬧到逊,春花似錦铣口、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,757評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至铜靶,卻和暖如春叔遂,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背争剿。 一陣腳步聲響...
    開封第一講書人閱讀 31,991評論 1 266
  • 我被黑心中介騙來泰國打工已艰, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人蚕苇。 一個(gè)月前我還...
    沈念sama閱讀 46,370評論 2 360
  • 正文 我出身青樓哩掺,卻偏偏與公主長得像,于是被迫代替她去往敵國和親涩笤。 傳聞我的和親對象是個(gè)殘疾皇子嚼吞,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,527評論 2 349

推薦閱讀更多精彩內(nèi)容