######裝飾器######
裝飾器的概念
- 裝飾器的實作是函數裡面嵌套函數;
- 裝飾器的本質是一個函數, 它可以讓其他函數在不需要做任何代碼改動的前提下增加額外的功能;
- 裝飾器需要傳遞一個函數, 傳回值也是一個函數對象.
######面向對象#######
一、面向對象的基本概念
面向過程和面向對象,是兩種不同的程式設計方式
對比面向過程的特點,可以更好的了解什麼是面向對象
過程和函數(都是對一段功能的代碼進行封裝)
過程:是早期的一個程式設計概念
過程類似于函數,隻能執行,但是沒有傳回值
函數:不僅能執行,還可以傳回結果(return)
二、面向過程 和 面向對象 的基本概念
面向過程:---側重于怎麼做?
1.把完成某一個需求的 所有步驟 從頭到尾 逐漸實作
2.根據開發要求,将某些功能獨立的代碼封裝成一個又一個函數
3.最後完成的代碼,就是順序的調用不同的函數
特點:
1.注重步驟與過程,不注重職責分工
2.如果需求複雜,代碼會變得很複雜
3.開發複雜項目,沒有固定的套路,開發難度很大
相比較函數,面向對象是更大的封裝,根據職責在一個對象中封裝多個方法
1.在完成某一個需求前,首先确定職責--要做的事(方法)
2.根據職責确定不同的對象,在對象内部封裝不同的方法(多個)
3.最後完成代碼,就是順序的讓不同的對象調用不同的方法
特點:
1.注重對象和職責,不同的對象承擔不同的職責
2.更加适合對複雜的需求變化,是專門應對複雜項目的開發,提供的固定套路
3.需要在面向過程的基礎上,再學習一些面向對象的文法
三、面向對象的兩個核心概念
1.類和對象的概念
類和對象是面向對象程式設計的兩個核心概念
類:是對一群具有相同特征或行為的事物的一個統稱,是抽象的,不能直接使用(就好比,飛機圖紙不能直接飛上天)
特征:被稱為屬性
行為:被稱為方法
類 就相當于制造飛機時的圖紙,是一個模闆,是負責建立對象的
對象:是由類建立出來的一個具體的存在,可以直接使用(圖紙創造出來的飛機,可以飛上天)
由哪一個類建立出來的對象,就擁有哪一個類種法定義的屬性和方法
“對象就相當于用圖紙創造出來的飛機”
2.類和對象的關系
類是模闆,對象是根據類這個模闆建立出來的,應該先有類,再有對象
類隻需要有一個 而對象可以有很多個(一張圖紙可以造出很多架飛機)
不同對象之前屬性可以不相同(比如飛機的顔色 等等。。)
類中定義了什麼屬性和方法,使用這個類建立出來的對象中就有什麼屬性和方法,不可能多也不可能少
四、面向對象的基本文法
定義一個隻包含方法的類
class 類名:
def 方法1(self,參數清單):
pass
def 方法2(self,參數清單):
pass
方法的定義格式和之前學的函數幾乎一樣
差別在于第一個參數必須是self
五、面向對象中的引用概念####
tom = Cat():在等号右側我們使用cat類建立了一個貓對象,在等号左側使用tom這個變量接收了這個貓對象
python解釋器在執行到此句代碼的時候,在記憶體中為這個貓對象配置設定了一個記憶體空間,然後再讓tom這個變量記錄了貓對象在記憶體中的位址
在python中使用類建立對象之後,tom變量中仍然記錄的是對象在記憶體中的位址
也就是tom變量引用了建立的貓對象
使用print輸出對象變量,預設情況下,是能夠輸出這個變量引用的對象是由哪一個類建立的象,以及在記憶體中的位址(十六進制表示)
提示:在計算機中,通常使用十六進制表示記憶體位址
六、内置方法和屬性#####
__del__方法:對象被從記憶體中銷毀前,會被自動調用
__str__方法:傳回對象的描述資訊,print函數輸出使用
__del__方法:
在python中
當使用類名()建立對象時,為對象配置設定完空間後,自動調用__init__方法
當一個對象被從記憶體中銷毀前(把這個對象從記憶體中删除掉),會自動調用__del__方法
應用場景
__init__改造初始化方法,可以讓建立對象更加靈活
__del__如果希望在對象被銷毀前,再做一些事情,可以考慮一下__del__方法
生命周期(出生到死亡)
一個對象從調用類名()建立,生命周期開始
一個對象的__del__方法一但被調用,生命周期結束
在對象的生命周期内,可以通路對象屬性,或者讓對象調用方法
__str__方法:
在python中,使用python輸出對象變量,預設情況下,會輸出這個變量引用的對象是由哪>一個類建立的對象,以及在記憶體中的位址(十六進制表示)
如果在開發中,希望使用print輸出對象變量時,能夠列印自定義的内容,就可以利用__str__這個内置方法了
七、私有屬性和私有方法
應用場景
在實際開發中,對象的某些屬性或方法可能隻希望在對象的内部使用,而不希望在外部被通路到
私有屬性 就是 對象 不希望公開的 屬性
私有方法 就是 對象 不希望公開的 方法
#####封裝#######
1.封裝是面向對象程式設計的一大特點
2.面向對象程式設計的第一步,将屬性和方法封裝到一個抽象的類中(為什麼類是抽象的?)
3.外界使用類建立對象,然後讓對象調用方法
4.對象方法的細節都被封裝在類的内部
######繼承######
實作代碼的重用,相同的代碼不需要重複的寫
繼承的傳遞性
1.C 類從B類繼承 ,B類又從A類繼承
2.那麼C類就具有B類和A類的所有屬性和方法
class A:
def eat(self):
print 'eat'
class B(A):
def drink(self):
print 'drink'
class C(B):
def sleep(self):
print 'sleep'
tom =C()
tom.eat()
tom.drink()
tom.sleep()
方法的重寫
1.覆寫父類的方法(重寫父類方法)
2.對父類方法進行擴充
class A:
def eat(self):
print 'eat'
class B(A):
def drink(self):
print 'drink'
class C(B):
def sleep(self):
print 'sleep'
def eat(self):
print '餓'
tom =C()
tom.eat()
tom.drink()
tom.sleep()
---------
餓
drink
sleep
---------
多繼承
子類擁有一個父類叫作單繼承
子類可以擁有多個父類,并且具有所有父類的屬性和方法
例如:孩子會繼承自己父親和母親的特征
class A:
def eat(self):
print 'eat-A'
def drink(self):
print 'drink-A'
class B(A):
def drink(self):
print 'drink-B'
def eat(self):
print 'eat-B'
class C(B,A):
pass
tom =C()
tom.eat()
tom.drink()
--------
eat-B
drink-B
--------
####.多态#####
不同的子類對象調用相同的方法,産生不同的執行結果
1.多态可以增加代碼的靈活度
2.以繼承和重寫父類的方法為前提
3.調用方法,不會影響到類的内部設計