面向对象初识
一、面向?qū)ο?OOP)基本概念
面向?qū)ο缶幊?——?Object Oriented Programming?簡(jiǎn)寫?OOP
1.1 過程和函數(shù)
-  過程?是早期的一個(gè)編程概念 
-  過程?類似于函數(shù),只能執(zhí)行,但是沒有返回值 
-  函數(shù)?不僅能執(zhí)行,還可以返回結(jié)果 
?
1.2 面相過程和面相對(duì)象基本概念
(1)面相過程?——?怎么做?
把完成某一個(gè)需求的所有步驟從頭到尾逐步實(shí)現(xiàn)
根據(jù)開發(fā)需求,將某些功能獨(dú)立的代碼封裝成一個(gè)又一個(gè)函數(shù)
最后完成的代碼,就是順序地調(diào)用?不同的函數(shù)
特點(diǎn)
注重步驟與過程,不注重職責(zé)分工
如果需求復(fù)雜,代碼會(huì)變得很復(fù)雜
開發(fā)復(fù)雜項(xiàng)目,沒有固定的套路,開發(fā)難度很大!
(2)?面向?qū)ο?/strong>?——?誰來做?
相比較函數(shù),面向?qū)ο?/strong>是更大的封裝,根據(jù)職責(zé)在一個(gè)對(duì)象中封裝多個(gè)方法
在完成某一個(gè)需求前,首先確定職責(zé)?——?要做的事情(方法)
根據(jù)職責(zé)確定不同的對(duì)象,在對(duì)象內(nèi)部封裝不同的方法(多個(gè))
最后完成的代碼,就是順序地讓?不同的對(duì)象調(diào)用不同的方法
特點(diǎn)
注重?對(duì)象和職責(zé),不同的對(duì)象承擔(dān)不同的職責(zé)
更加適合應(yīng)對(duì)復(fù)雜的需求變化,是專門應(yīng)對(duì)復(fù)雜項(xiàng)目開發(fā),提供的固定套路
需要在面向過程基礎(chǔ)上,再學(xué)習(xí)一些面向?qū)ο蟮恼Z法
?
二、類和對(duì)象
01. 類和對(duì)象的概念
1.1 類
-  類是對(duì)一群具有?相同特征或者行為的事物的一個(gè)統(tǒng)稱,是抽象的,不能直接使用 - 特征?被稱為?屬性
- 行為?被稱為?方法
 
- 類就相當(dāng)于制造飛機(jī)時(shí)的圖紙,是一個(gè)模板,是負(fù)責(zé)創(chuàng)建對(duì)象的
1.2 對(duì)象
-  對(duì)象是由類創(chuàng)建出來的一個(gè)具體存在,可以直接使用 
-  由哪一個(gè)類創(chuàng)建出來的對(duì)象,就擁有在哪一個(gè)類中定義的: - 屬性
- 方法
 
-  對(duì)象就相當(dāng)于用圖紙制造的飛機(jī) 
在程序開發(fā)中,應(yīng)該先有類,再有對(duì)象
?
02. 類和對(duì)象的關(guān)系
-  類是模板,對(duì)象是根據(jù)類這個(gè)模板創(chuàng)建出來的,應(yīng)該先有類,再有對(duì)象 
-  類?只有一個(gè),而?對(duì)象?可以有很多個(gè) -  不同的對(duì)象?之間?屬性?可能會(huì)各不相同 
 
-  
- 類?中定義了什么?屬性和方法,對(duì)象?中就有什么屬性和方法,不可能多,也不可能少
?
03. 類的設(shè)計(jì)
在使用面相對(duì)象開發(fā)前,應(yīng)該首先分析需求,確定一下,程序中需要包含哪些類!
在程序開發(fā)中,要設(shè)計(jì)一個(gè)類,通常需要滿足一下三個(gè)要素:
類名?這類事物的名字,滿足大駝峰命名法
屬性?這類事物具有什么樣的特征
方法?這類事物具有什么樣的行為
大駝峰命名法
每一個(gè)單詞的首字母大寫
單詞與單詞之間沒有下劃線
3.1 類名的確定
名詞提煉法分析整個(gè)業(yè)務(wù)流程,出現(xiàn)的名詞,通常就是找到的類
3.2 屬性和方法的確定
-  對(duì)?對(duì)象的特征描述,通常可以定義成?屬性 
-  對(duì)象具有的行為(動(dòng)詞),通常可以定義成?方法 
實(shí)例:
-  小明?今年?18 歲,身高 1.65,每天早上?跑?完步,會(huì)去?吃?東西 
-  小強(qiáng)?今年?16 歲,身高 1.60,小強(qiáng)不跑步,小強(qiáng)喜歡?吃?東西 
?
三、面相對(duì)象基礎(chǔ)語法
01.?dir?內(nèi)置函數(shù)
在Python中對(duì)象幾乎是無所不在的,我們之前學(xué)習(xí)的變量、數(shù)據(jù)、函數(shù)都是對(duì)象;
使用內(nèi)置函數(shù)?dir傳入標(biāo)識(shí)符?/?數(shù)據(jù),可以查看對(duì)象內(nèi)的所有屬性及方法;
?
提示:?__方法名__?格式的方法是?Python?提供的?內(nèi)置方法 / 屬性
| 01 | __new__ | 方法 | 創(chuàng)建對(duì)象時(shí),會(huì)被?自動(dòng)?調(diào)用 | 
| 02 | __init__ | 方法 | 對(duì)象被初始化時(shí),會(huì)被?自動(dòng)?調(diào)用 | 
| 03 | __del__ | 方法 | 對(duì)象被從內(nèi)存中銷毀前,會(huì)被?自動(dòng)?調(diào)用 | 
| 04 | __str__ | 方法 | 返回對(duì)象的描述信息,print?函數(shù)輸出使用 | 
?
02. 定義簡(jiǎn)單的類(只包含方法)
?面向?qū)ο笫歉蟮姆庋b,在一個(gè)類中封裝多個(gè)方法,這樣通過這個(gè)類創(chuàng)建出來的對(duì)象,就可以直接調(diào)用這些方法了!
2.1 定義只包含方法的類
class 類名:def 方法1(self, 參數(shù)列表):passdef 方法2(self, 參數(shù)列表):pass-  方法的定義格式和之前學(xué)習(xí)過的函數(shù)幾乎一樣 
-  區(qū)別在于第一個(gè)參數(shù)必須是self 
注意:類名的命名規(guī)則 要符合大駝峰命名法
2.2 創(chuàng)建對(duì)象
對(duì)象變量 = 類名()2.3 第一個(gè)面向?qū)ο蟪绦?/strong>
class Dog:"""這是一個(gè)狗類"""def eat(self):print("eat....")def run(self):print("run....")dog = Dog()dog.eat()dog.run()引用的概念
在Python中使用類創(chuàng)建對(duì)象之后,dog變量中仍然記錄的是對(duì)象在內(nèi)存中的地址
也就是dog變量引用了新建的狗對(duì)象
使用print輸出對(duì)象變量,默認(rèn)情況下,是能夠輸出這個(gè)變量引用的對(duì)象是由哪一個(gè)類創(chuàng)建的對(duì)象,以及在內(nèi)存中的地址(十六進(jìn)制表示)
提示:在計(jì)算機(jī)中,通常使用十六進(jìn)制表示內(nèi)存地址
-  十進(jìn)制?和?十六進(jìn)制?都是用來表達(dá)數(shù)字的,只是表示的方式不一樣 
-  十進(jìn)制?和?十六進(jìn)制?的數(shù)字之間可以來回轉(zhuǎn)換 
-  %d?可以以?10 進(jìn)制?輸出數(shù)字 
-  %x?可以以?16 進(jìn)制?輸出數(shù)字 
?
03. 方法中的?self?參數(shù)
3.1給對(duì)象增加屬性
在python中,要給對(duì)象設(shè)置屬性,非常的容易,但是不推薦使用,因?yàn)?#xff1a;對(duì)象屬性的封裝應(yīng)該封裝在類的內(nèi)部
只需要在類的外部的代碼中直接通過 . 設(shè)置一個(gè)屬性即可;
dog.name = "薩摩"3.2 使用?self?在方法內(nèi)部輸出狗的名字
由哪一個(gè)對(duì)象調(diào)用的方法,方法內(nèi)的 self? 就是哪一個(gè)對(duì)象的引用。
-  在類封裝的方法內(nèi)部,self?就表示?當(dāng)前調(diào)用方法的對(duì)象自己 
-  調(diào)用方法時(shí),程序員不需要傳遞?self?參數(shù) 
-  在方法內(nèi)部 -  可以通過?self.?訪問對(duì)象的屬性 
-  也可以通過?self.?調(diào)用其他的對(duì)象方法 
 
-  
-  在?類的外部,通過?變量名.?訪問對(duì)象的?屬性和方法 
-  在?類封裝的方法中,通過?self.?訪問對(duì)象的?屬性和方法 
04. 初始化方法
4.1 初始化方法
當(dāng)使用類名()創(chuàng)建對(duì)象時(shí),會(huì)?自動(dòng)?執(zhí)行以下操作:
這個(gè)?初始化方法?就是__init__方法,__init__是對(duì)象的內(nèi)置方法
__init__方法是?專門?用來定義一個(gè)類?具有哪些屬性的方法!
4.2 在初始化方法內(nèi)部定義屬性
-  在__init__方法內(nèi)部使用?self.屬性名 = 屬性的初始值就可以定義屬性 
-  定義屬性之后,再使用Dog類創(chuàng)建的對(duì)象,都會(huì)擁有該屬性 
4.3 改造初始化方法 —— 初始化的同時(shí)設(shè)置初始值
在開發(fā)中,如果希望在創(chuàng)建對(duì)象的同時(shí),就設(shè)置對(duì)象的屬性,可以對(duì) __init__方法進(jìn)行改造
-  把希望設(shè)置的屬性值,定義成__init__方法的參數(shù) 
-  在方法內(nèi)部使用?self.屬性 = 形參?接收外部傳遞的參數(shù) 
-  在創(chuàng)建對(duì)象時(shí),使用?類名(屬性1, 屬性2...)?調(diào)用 
05. 內(nèi)置方法和屬性
| 01 | __del__ | 方法 | 對(duì)象被從內(nèi)存中銷毀前,會(huì)被?自動(dòng)?調(diào)用 | 
| 02 | __str__ | 方法 | 返回對(duì)象的描述信息,print?函數(shù)輸出使用 | 
5.1?__del__?方法
-  在python中 - 當(dāng)使用類名()創(chuàng)建對(duì)象時(shí),為對(duì)象分配完空間后,自動(dòng)調(diào)用__init__方法
- 當(dāng)一個(gè)對(duì)象被從內(nèi)存中銷毀?前,會(huì)自動(dòng)調(diào)用__del__方法
 
-  應(yīng)用場(chǎng)景 - __init__改造初始化方法,可以讓創(chuàng)建對(duì)象更加靈活
- __del__如果希望在對(duì)象被銷毀前,再做一些事情,可以考慮一下 __del__方法
 
- 生命周期- 一個(gè)對(duì)象從調(diào)用類名()創(chuàng)建,生命周期開始
- 一個(gè)對(duì)象的__del__方法一旦被調(diào)用,生命周期結(jié)束
- 在對(duì)象的生命周期內(nèi),可以訪問對(duì)象屬性,或者讓對(duì)象調(diào)用方法
 
- 一個(gè)對(duì)象從調(diào)用類名()創(chuàng)建,生命周期開始
5.2?__str__?方法
-  在python中,使用print輸出對(duì)象變量,默認(rèn)情況下,會(huì)輸出這個(gè)變量引用的對(duì)象是由哪一個(gè)類創(chuàng)建的對(duì)象,以及在內(nèi)存中的地址(十六進(jìn)制表示) 
-  如果在開發(fā)中,希望使用print輸出對(duì)象變量時(shí),能夠打印自定義的內(nèi)容,就可以利用 __str__這個(gè)內(nèi)置方法了 
注意? __str__方法必須返回一個(gè)字符串
class Dog:def __init__(self,name):self.name = nameprint("%s 來了" % self.name)def __del__(self):print("%s 去了" % self.name)def __str__(self):return "小狗%s" % self.namesamo = Dog("薩摩")print(samo)?
四、私有屬性和私有方法
01. 應(yīng)用場(chǎng)景及定義方式
1.1應(yīng)用場(chǎng)景
-  在實(shí)際開發(fā)中,對(duì)象?的?某些屬性或方法?可能只希望?在對(duì)象的內(nèi)部被使用,而?不希望在外部被訪問到 
-  私有屬性?就是?對(duì)象?不希望公開的?屬性 
-  私有方法?就是?對(duì)象?不希望公開的?方法 
1.2定義方式
-  在?定義屬性或方法時(shí),在?屬性名或者方法名前?增加?兩個(gè)下劃線,定義的就是?私有?屬性或方法 
?
02. 偽私有屬性和私有方法
提示:在日常開發(fā)中,不要使用這種方式,訪問對(duì)象的私有屬性或私有方法
python中,并沒有?真正意義?的?私有
?
- 在給?屬性、方法?命名時(shí),實(shí)際是對(duì)?名稱?做了一些特殊處理,使得外界無法訪問到
- 處理方式:在?名稱?前面加上 _類名 => _類名__名稱
?
轉(zhuǎn)載于:https://www.cnblogs.com/ForT/p/10337359.html
總結(jié)
 
                            
                        - 上一篇: 如何评价模型的好坏(一)
- 下一篇: CodeForces - 1110E-M
