先說面向過程 面向過程主要考慮的是怎麼做 把完成摸個需求的 所有步驟 從頭到尾 逐步實現 根據開發需求,將某些功能獨立的代碼封裝成一個又一個的函數 最後完成的代碼就是順序的調用不同的函數. 特點是: 註重不准走與過程,不註重職責分工. 如果需求複雜,代碼會變的很複雜 開發複雜項目,沒有固定套路,開發 ...
先說面向過程
面向過程主要考慮的是怎麼做
把完成摸個需求的 所有步驟 從頭到尾 逐步實現
根據開發需求,將某些功能獨立的代碼封裝成一個又一個的函數
最後完成的代碼就是順序的調用不同的函數.
特點是:
註重不准走與過程,不註重職責分工.
如果需求複雜,代碼會變的很複雜
開發複雜項目,沒有固定套路,開發難度很大.
面向對象
側重點是誰來做?
相比較函數,面向對象是更大的封裝,根據職責在一個對象中封裝多個方法.
在完成某偶一個需求前首先確定職責--要做的事情(方法)
根據職責確定不同的對象,在對象內部封裝不同的方法(多個)
最後完成的代碼就是順序的讓不同對象調用不同的方法.
特點是:
註重對象和職責,不同的對象承擔不同的職責
更加適合對應複雜的需求變化,最專門應對複雜項目開發,提供固定套路
需要面向過程的基礎上,再學習一些面向對象的語法.
例子:
類和對象是面向對象編程的兩個核心概念
類是對一群具有相同特征或者行為的實物的一個統稱,是抽象的,不能直接使用
特征被稱為 屬性
行為被稱為 方法
對象 是由類創建出來的一個具體存在,可以直接使用
由哪一個類創建出來的對象 就擁有在哪一個類中定義的 屬性和方法
類相當於圖紙,對象就是用圖紙創造出來的東西
在程式開發中先有類,再有對象.
類和對象的關係:
類是模板,對象是根據類這個模板創建出來的.
類只有一個,而對象可以有很多個.
不同的對象之間屬性可能會各不相同.
類中定義了什麼 屬性和方法,對象中就有什麼屬性和方法,不可能多也不可能少.
類的設計
在使用面向對象開發前應該啥偶先分析需求,確定一下,程式中需要包含哪些類!
在程式開發中藥設計一個類,通常需要滿足以下三個要素.:
- 類名,這類事物的 名字 ,滿足大駝峰命名法(每個單詞的首字母大寫,單詞與單詞之間沒有下劃線)
- 屬性,這類事物具有什麼樣的特征
- 方法,這類事物具有什麼樣的行為.
類名的確定
名詞提煉法:分析整個業務流程,出現的 名詞,通常就是要找到的類.
屬性和方法的確定
- 對對象的特征描述, 通常可以定義成屬性.
- 對對象具有的行為(動詞),通常可以定義成方法.
提示:需求中沒有涉及的屬性或方法在涉及類時,不需要考慮.
基礎語法
dir內置函數
- 在python中對象是無所不在的,變數,數據,函數都是對象
在python中可以使用兩個方法驗證:
- 在標識符/數據後輸入一個.. 然後按下tab ipython會提示改對象能夠調用的方法列表.
- 使用內置的dir傳入標識符/數據/可以查看對象內所有屬性及方法:
dir(print)
- dir後可以看到
__doc__
方法 這是定義類時候的說明.
4.提示__方法名__
格式的方法是python提供的內置方法/屬性,:
4.1__new__
創建對象時候會被自動調用
4.2__init__
對象被初始化時會自動調用
4.3__del__
對象被從記憶體中銷毀前會自動調用
4.4__str__
返回對象的描述信息,print函數輸出使用.
定義簡單的類(只包含方法)
- 面向對象是更大的封裝,在一個類中封裝多個方法,這樣通過這個類創建出來的對象,就可以直接調用這些方法了!
- 定義只包含方法的類
class 類名:
def 方法1(self, 參數列表):
pass
def 方法2(self, 參數列表):
pass
- 方法的定義格式和之前學習的函數幾乎一樣
- 區別在於第一個參數必須是
self
*註意類名命名規則要符合大駝峰命名法.
2.創建對象 - 當一個類 定義完成之後,要使用這個類來創建對象語法如下
對象變數 = 類名()
第一個面向對象的演練
- 需求分析(很重要)
- 小貓愛吃魚, 小貓要喝水
1.1 定義一個貓類 Cat
1.2 定義兩個方法 eat 和 dirnk
2.代碼:
class Cat():
def eat(self):
print('吃魚吃魚')
def drink(self):
print('喝水喝水')
#開始調用
tom = Cat()
tom.eat()
tom.drink()
引用概念的強調
在面向對象開發中,引用概念是同樣適用的!
解釋器先執行等號右邊的內容 在記憶體中創建了一個對象
然後在讓tom這個變數引用這個對象的記憶體地址.
- 在python中使用類創建對象後,tom變數中仍然記錄的是對象在記憶體中的地址.
- 也就是tom變數引用了新建的貓對象
- 使用print輸出對象變數.預設情況下是能夠輸出這個變數應用的對象是由哪一個類創建的對象,以及在記憶體中的地址(十六進位表示.)
在電腦中通常使用十六進位表示記憶體地址
%d 可以以10進位輸出數字
%x 可以以16進位輸出數字
應用id函數
addr = id(tom)
print("%d" % addr) # %x可以看到16進位.
再創建多個對象
lazy_cat = Cat()
lazy_cat.eat()
lazy_cat.drink()
這兩個貓對象 不是同一個對象,查看其記憶體地址就可以知道了.
但是如果我們用另外一個變數去接收lazy_cat 例如
mao1 = lazy_cat
這樣mao1 和lazy_cat就是一樣的了 只是變數名字的變化
在類的外部給類增加屬性(不要用,會報錯!)
- 在python中,要在對象外設置屬性,非常容易 但是不推薦使用,因為對象屬性的封裝應該封裝在類的內部
- 只需要在類的外部的代碼中直接通過
.
設置一個屬性即可
huamao.name = '花貓'
# 調用
huamao.name
利用self在類封裝的方法中輸出對象屬性
class Cat:
def eat(self):
print("%s 愛吃魚" % self.name)
# 測試
mao1 = Cat()
mao1.name = '湯姆'
mao1.eat()
- self 就是記錄這個對象本身的,可以知道具體操作的那個對象.
- 哪一個對象調用的方法,self就是那個對象的應用.
- 在方法內部 想要使用那個屬性,就用self.屬性名 就可以了
- 在類封裝方法內部 self 就表示當前調用方法的對象自己
- 在方法內部可以通過
self.
訪問對象的屬性,也可以通過self.
調用其他對象的方法.
初始化方法
- 當使用類名()創建對象時,會自動執行以下操作:
- 為對象在記憶體中分配空間 --創建對象
- 為對象的屬性設置初始值 --初始化方法(init)
- 這個初始化方法就是
__init__
方法,__init__
方法是對象的內置方法.
__init__
方法是專門用來定義一個雷具有哪些屬性的放方法
在cat中增加__init__
方法,驗證該方法在創建對象時會被自動調用
class Cat:
'''這是一個貓類'''
def __init__(self):
print("初始化方法")
- 在`
__init__
方法內部使用 `self.屬性名 = 屬性值 就可以定義屬性. - 定義屬性之後再使用Cat類創建對象 都會擁有該屬性.
# 重構Cat類
class Cat:
def __init__(self):
print('這是一個初始化方法')
self.name = 'Tom'
def eat(self):
print("%s愛吃魚" % self.name)
# 調用
tom = Cat()
tom.eat()
print(tom.name)
改造初始化方法 --舒適化的同時設置初始值
- 在開發中,如果希望在創建對象的同時就設置對象的屬性,可以對
__init__
進行改造
- 把希望設置的屬性值,定義成
__init__
方法的參數 - 在方法內部使用
self.屬性 = 形參
接受外部傳遞的參數 - 在創建對象時,使用
類名(屬性1,屬性2)
調用
例子:
class Cat:
def __init__(self, name):
print("初始化方法 %s"% name)
self.name = name
# 調用
tom = Cat('Tom')
__del__
和__str__
方法
- 當時用類名創建對象時 分配完空間後,自動調用
__init__
方法但是當一個對象被從記憶體中銷毀前會自動調用__del__
方法.
*生命周期
- 一個對象從調用
類名()
創建,生命周期開始. - 一個對象的
__del__
方法一旦被調用,生命周期結束 - 在對象的生命周期內,可以訪問對象屬性,或者讓對象調用方法
- 在python中,使用print輸出對象變數,預設情況下會輸出這個變數應用的對象使用哪一個類創建的對象,以及記憶體中管道地址.
- 在開發中 希望使用print 輸出對象變數時,能夠列印自定義的內容,就可以利用
__str__
這個內置方法付了. - 註意
__str__
方法必須返回一個字元串
class Cat:
def __init__(self, new_name):
self.name = new_name
print(self.name +'你好')
def __del__(self):
print(self.name+'走了')
def __str__(self):
return '這是__str__'
面向對象練習.
目標: 封裝 小明愛跑步 存放傢具
- 封裝
1.1 封裝是面向對象編程的一大特點
1.2 面向對象編程的第一步 將屬性和方法封裝到一個抽象的類中.
1.3 外界使用類創建對象,然後讓對象調用方法
1.4 對象方法的細節都被封裝在類的內部 - 小明愛跑步.
2.1 小明體重 75.0公斤
2.2 小明每次跑步會減肥0.5公斤
2.3 吃東西體重增加1公斤.
- 在對象的方法內部,是可以直接訪問對象的屬性的.
中間部分略過,以後補
私有屬性和方法
應用場景和定義
- 在實際開發中,對象的某些屬性或方法可能只希望在對象的內部被使用,而不希望在外部被訪問到
- 私有屬性就是對象不希望公開的屬性
- 私有方法就是對象不希望公開的方法
定義方式
- 在定義屬性或方法時,在屬性名或者方法名前面增加兩個下劃線,定義就是私有屬性或方法.
例子:
class Women:
def __init__(self, name):
self.name = name
self.__age = 18
def secret(self):
print("%s 的年齡是 %d "%(self.name, self.__age))
# 測試
xiaofang = Women("小芳")
print(xiaofang.__age) # 這個就調用不了了.私有屬性 在外界不能被直接訪問.
xiaofang.secret() # 但是在對象的方法內部可以訪問.
方法同理 不希望外界調用的方法前面加`__`,外部就調用不了了,只可以在類的內部調用.
偽私有屬性和方法
在日常開發中不要使用這種方式,訪問隊形的私有屬性或私有方法.
- 在python,並沒有真正意義的私有
- 加了
__
實際只是python做了一些特殊處理 - 具體方式為:在在名稱前面加上
_類名__名稱
例子:
print(xiaofang._Women__age)