Python—③Python面向對象

Python—③Python面向對象

<<<CSDN排版不美觀,想看排版美觀的進Python—③Python面向對象>>>

1、Python面向對象(Object Oriented,OO)

①面向對象(Object Oriented,OO)與面向過程(Procedure Oriented)
面向對象(Object Oriented,OO)是把數據及對數據的操作方法放在一起,作爲一個相互依存的整體——對象。面向對象將功能封裝進對象,強調具備了功能的對象;面向對象關注的是解決問題需要哪些對象
面向過程(Procedure Oriented) 可以理解成自上而下順序執行,逐步求精;它是其程序結構是按功能劃分爲若干個基本模塊,這些模塊形成一個樹狀結構;面向過程強調的是功能行爲;它關注的是解決問題需要哪些步驟

②類和對象
類是對一羣具有相同特徵或者行爲的事物的一個統稱,是抽象的,不能直接使用
特徵相當於類的屬性
行爲相當於類的方法
類相當於一個模板,或者說是一張圖紙,而對象就是根據這個模板或者這張圖紙(即類)創建出來的一個具體的實物
先有類,再有對象

類的三要素
類名:類名滿足大駝峯命名法(每個單詞首字母都大寫)
屬性:該類事物具有什麼樣的特徵
方法:該類事物具有什麼樣的行爲

dir內置函數
其實Pyhton中變量、數據、函數等都是對象,兩個方法驗證:
1、在該 標識符 後輸入一個 . ,看PyCharm會不會提示有方法,或者在iPython中按下Tab鍵,是否提示有方法
2、使用內置函數dir傳入該 標識符,可以查看對象內所有屬性及方法

提示: 方法名 格式的方法是Python提供的內置方法或屬性

new >>> 創建對象時,會被自動調用
init >>> 對象被初始化時,會被自動調用
del >>> 對象被從內存中銷燬前,會被自動調用
str >>> 返回對象的描述信息,print函數輸出使用
提示:利用好dir函數,有很多內容就不需要死記硬背。

定義類(與Java類似)
class 類名:
def 方法名(self,參數列表):

創建對象
對象名=類名()

面向對象中的引用概念
Python中使用類創建對象之後,對象名指向的是對象在內存中的地址,即對象名指向了對象的地址
如果使用print函數輸出對象名,可以看到該對象名引用的對象來自於哪一個類,以及在內存中的地址(十六進制)
%d可以以十進制輸出數字;%x可以以十六進制輸出數字

方法中的self參數
給對象設置屬性,可以直接 對象名.屬性=“值” (但是不推薦使用,作爲了解;因爲屬性最好包含在類的內部)
self指的是當前這個對象,要訪問該對象的屬性,可以 self.屬性;要訪問該對象的屬性,可以 self.方法

__init__初始化方法
當使用類名() 創建對象時,會自動執行以下操作:
1、爲對象在內存中分配空間——創建對象 2、爲對象屬性設置初始值——初始化方法(init)
init 初始化方法,是對象的內置方法;__init__方法是專門用來定義一個類具有哪些屬性的方法
即創建對象後會自動執行初始化方法,用來定義一個類具有哪些屬性的

在__init__方法內部,寫 self.屬性名=“初始化值” ,就可以給對象的屬性賦有初始值
步驟:
1、在__init__方法中使用 self.屬性名=“初始化值”
2、創建對象時使用類名(屬性1、屬性2…)

__del__方法
對象創建後在空間分配完內存後,就會自動調用__init__方法
當一個對象在內存中被銷燬前,會自動調用__del__方法
如果希望對象在被銷燬前,執行一些代碼,則可以放入__del__方法中

__str__方法
在Python中直接輸出對象名時,默認會輸出 該對象由哪一個類創建以及在內存中的地址(十六進制)
如果在開發中,希望使用print輸出對象變量時,能夠打印自定義內容,就可以利用__str__內置方法
注意:__str__方法需要返回字符串

③面向對象之封裝
封裝,即隱藏對象的屬性和實現細節,僅對外公開接口,控制在程序中屬性的讀和修改的訪問級別;將抽象得到的數據和行爲(或功能)相結合,形成一個有機的整體,也就是將數據與操作數據的源代碼進行有機的結合,形成“類”,其中數據和函數都是類的成員。
簡而言之,即將屬性和方法封裝到一個抽象的類中;然後外界調用時,直接由該類創建對象,然後直接通過 對象.方法 解決問題,而不需要關係對象方法的細節在類中是怎樣的;同一類創建的多個對象的屬性互不干擾

如果定義屬性值,不知道設置什麼初始值時,可以將值設置爲 None ,任何變量都可以設置爲 None
判斷一個變量值是否爲None,需用到身份運算符
is >>> is是判斷兩個標識符是不是引用同一個對象 >> x is y,類似id(x)==id(y)
is not >>> is not是判斷兩個標識符是不是引用不同對象 >> x is not y,類似id(x)!=id(y)
is 與 == 區別:
is用於判斷兩個變量引用對象是否是同一個
== 用於判斷引用變量的值是否相等
結論:在Python中針對None比較時,建議用 is 判斷,這也是PEP8的規範要求

私有屬性和私有方法
在實際開發中,對象的某些屬性或方法 可能只有對象的內部使用,而不希望被外部訪問到,這時候就可以私有,也可以保證一定的安全性
私有屬性即 對象 的屬性不希望被外界訪問到方法
私有方法即 對象 的屬性不希望被外界訪問到的方法
私有屬性將屬性前加上 __ ,即兩個英文下劃線,就定義成了私有屬性,外界不能訪問,只能在本類中訪問
私有方法將屬性前加上 __ ,即兩個英文下劃線,就定義成了私有方法,外界不能訪問,只能在本類中訪問

僞私有屬性和僞私有方法
提示:在日常開發中,不要使用這種方式訪問對象的 私有屬性 和 私有方法
Python在對 私有屬性 和 私有方法處理時,實際是對名字進行了特殊的處理,使得外界無法訪問
處理方式:_類名__屬性名或方法名
用 對象._類名__屬性名或方法名 就可以訪問到私有屬性和私有方法了

④面向對象之繼承
繼承是面向對象軟件技術當中的一個概念,與多態、封裝共爲面向對象的三個基本特徵。 繼承可以使得子類具有父類的屬性和方法或者重新定義、追加屬性和方法等。
繼承:子類擁有父類的所有 屬性和方法

繼承的語法:
class 類名(父類名):

子類繼承父類後,然後再根據子類自己的特性,封裝子類自己特有的方法

繼承中的專業術語(瞭解):
假設有兩個類 Animal類 和 Dog類,Animal類是父類,Dog類是子類
我們稱Dog類是Animal的子類,Animal是Dog類的父類,Dog類從Animal類繼承
我們也稱Dog類是Animal的派生類,Animal類是Dog類的基類,Dog類從Animal類派生

繼承的傳遞性
C類從B類繼承,B類又從A類繼承
那麼C類就具有A類和B類的所有屬性和方法
即子類擁有父類以及父類的父類中封裝的所有屬性和方法

方法的重寫override
如果在開發中,子類的方法實現和父類的方法實現不同,就可以使用重寫(也叫複寫或覆蓋),在子類中 重新編寫 父類的方法
實現:在子類中定義一個與父類方法名相同的函數
在運行時,如果調動該方法,就只會調用子類重寫的方法,而不會調用父類的方法

另外也有一種應用場景:
子類的方法是在父類的方法有擴展,即父類原本封裝的方法實現是子類方法的一部分
這時就可以在子類複寫父類方法中,在需要的位置使用 super().父類方法 來調用父類的方法,然後再根據需求寫子類特殊的部分
(這個和Java中稍微不同,Java規定 super.父類方法 必須寫在子類方法的第一行,而Python無此規定;而且Java是 super.父類方法 ,在Python是 super().父類方法 )
在Python中,super是一個特殊的類,super() 可以看成是 super類 創建出來的對象

擴展:
在Python2.x中,如果需要調用父類的方法,還可以使用一下方式:
父類名.方法(self)
在目前Python3.x 還支持該方法,但是不推薦,因爲一旦父類發生變化,方法調用位置的類名同樣需要修改

繼承中,父類的私有屬性和私有方法
子類對象 不能再自己的內部直接訪問父類的 私有屬性 或 私有方法
解決:子類對象 通過父類的共有方法簡介訪問到 私有屬性 和 私有方法

多繼承
子類繼承一個父類的情況叫做單繼承
當子類擁有多個父類時 就叫多繼承
多繼承語法
class 子類名(父類名1,父類名2…)

多繼承的使用注意事項
如果父類之間存在同名的屬性或方法,應該避免使用多繼承

提問:如果不同的父類中存在相同的方法名,子類在調用時,會調用哪一個父類中的方法呢?
回答:會按照繼承的順序,依次先在自己本類中找,接着按繼承的順序在父類中找,最後再object類中找

MRO——方法搜索順序
Python中針對類提供了一個內置屬性__mro__,可以查看方法搜索順序
MRO是 method resolution order,主要用於在多繼承時判斷方法、屬性的調用路徑
使用:類.mro

新式類與舊式類(經典類)
object是Python爲所有對象提供的基類,提供有一些內置的屬性和方法,可以使用 dir函數 查看
新式類:以object爲基類的類,推薦使用
經典類:不以object爲基類的類,不推薦使用
在Python3.x中定義類時,如果沒有指定父類,會默認使用 object 作爲該類的基類——Python3.x中定義的類都是新式類
在Python2.x中定義類時,如果沒有指定父類,則不會以 object 作爲基類
新式類和經典類在多繼承時——會影響到方法的搜索順序
爲了保證編寫的代碼能同時在Python2.x和Python3.x中運行
所以在定義類如果沒有父類,建議統一繼承自object
class 類名(object)

⑤面向對象之多態
封裝 將 屬性和方法 封裝到一個抽象的類中,以保證整體性和安全性
繼承 可以實現代碼的複用,相同的代碼不需要反覆的編寫
多態 不同的子類對象調用相同的父類方法,產生不同的結果,增加代碼的擴展性與靈活性
多態即同一個行爲具有多個不同表現形式或形態的能力

類對象
在Python中,可以將類看成是特殊的對象,即類對象
在程序運行時,類對象在內存中只有一個,使用一個類可以創建出多個對象實例
類也有自己的屬性和方法,我們叫做類屬性和類方法,通過 類名. 的方式可以訪問類的屬性或者調用類的方法

類屬性就是給 類對象 定義的屬性,通常用於記錄與這個類有關的特徵,類屬性不會用於記錄具體對象的特徵
類屬性的獲取可以理解成一個 向上查找機制
當調用 對象.屬性 時,首先會在對象內部查找對象屬性,如果沒有,就向上看有沒有該名字的類屬性
因此訪問類屬性可以:1、類名.類屬性 2、對象.類屬性(不推薦)
注意:如果使用 對象.類屬性=值 賦值語句,只會給對象添加一個屬性,而不會影響到類屬性的值
類屬性就是類對象定義的屬性,使用賦值語句在class關鍵字下方可以定義類屬性,類屬性通常用於記錄這個類的相關特徵

類方法
類方法就是針對類對象定義的方法
在類方法內部可以直接訪問類屬性或者調用其他的類方法
@classmethod
def 類方法名(cls):

修飾器 @classmethod 用來告訴解釋器這是一個類方法的,傳的第一個參數應該爲 cls
cls標識由哪一個類調用的方法,方法內的cls就是哪一個類的引用
提示:不過使用其他名稱也可以,不過習慣使用的是 cls ,通過 類名. 調用類方法時,不需要傳遞cls參數
在方法內部,可以通過 cls. 訪問類的屬性,也可以通過 cls. 調用其他類方法

靜態方法
在開發時,如果需要在類中封裝一個方法,這個方法:
既不需要訪問實例屬性或者調用實例方法、也不需要訪問類屬性或者調用類方法,就可以將該方法封裝成靜態方法
@staticmethod
def 靜態方法名():

小結:
當方法內部需要訪問實例屬性時就用實例方法,實例方法內部可以使用 類名. 訪問類屬性
方法內部只需要訪問類屬性就使用類方法
方法內部不需要訪問實例屬性和類屬性
如果方法內部既需要訪問實例屬性,又需要訪問類屬性,應該定義成實例方法,當訪問類屬性可以使用 類名.

⑤單例設計模式
設計模式(Design pattern)代表了最佳的實踐,通常被有經驗的面向對象的軟件開發人員所採用。設計模式是軟件開發人員在軟件開發過程中面臨的一般問題的解決方案。這些解決方案是衆多軟件開發人員經過相當長的一段時間的試驗和錯誤總結出來的
單例模式,是一種常用的軟件設計模式。在它的核心結構中只包含一個被稱爲單例的特殊類。通過單例模式可以保證系統中,應用該模式的類一個類只有一個實例。即一個類只有一個對象實例
比如 任務管理器、音樂播放器、回收站 等等,都是單例設計模式的應用

__new__方法
使用類名()創建對象時,Python解釋器首先會調用__new__方法爲對象分配空間
new 是一個由object基類提供的內置靜態方法,主要作用有:
1、在內存中爲對象分配空間
2、返回對象的引用
Python解釋器獲得對象的引用後,將引用作爲第一個參數,傳遞給 init 方法
重寫 new 方法得注意,一定要 return super().new(cls),否則Python解釋器得不到分配了空間的對象引用,將不會調用對象的初始化方法,其中 super().new(cls) ,這其中的 cls 即爲創建的是哪個類,所以爲cls
注意:new 是一個靜態方法,在調用時需要主動傳遞 cls 參數

單例模式Python定義步驟
1、定義一個類屬性,初始值爲 None,用於記錄單例對象的引用
2、重寫 new 方法
3、如果類屬性 is None ,調用父類方法分配空間,並在類屬性中記錄結果
4、返回類屬性中記錄的對象引用

在每次使用類名()創建對象時,Pyhton的解釋器都會自動調用兩個方法:
new 分配空間
init 對象初始化
讓 __new__方法每次調用都只返回第一次被創建對象的引用,按上述定義步驟可以實現,但是還存在 初始化方法會被再次調用
解決步驟:
1、定義一個類屬性 init_flag 標記是否執行過初始化動作,初始值爲False
2、在 __init__方法中,判斷 init_flag,如果爲False就執行初始化動作
3、然後將 init_flag 設置爲 True
4、這樣再次自動調用 __init__方法時,初始化動作就不會被再次執行了

⑥異常
程序在運行時,如果Python遇到一個錯誤,會停止程序執行,並且提示一些錯誤信息,這就是異常
程序停止執行並且提示錯誤信息的動作,我們稱之爲 拋出(raise)異常

所以可以通過 異常捕獲 可以針對突發事件做集中處理,從而保證程序的穩定性和健壯性
語法:
try:
嘗試執行的代碼(可能會出錯的代碼)
except:
處理錯誤
try 嘗試下方的代碼,不確定是否能夠正常執行代碼;except 如果不是,下方編寫嘗試失敗的代碼
錯誤類型捕獲
如果遇到不同類型的異常,需要做針對性處理
語法:
try:
嘗試執行的代碼(可能會出錯的代碼)
except 錯誤類型1:

except(錯誤類型2,錯誤類型3):

except Exception as result:
print(“未知錯誤 %s” % result)
當Python解釋器拋出異常時,最後一行錯誤信息的第一個單詞,就是錯誤的類型

捕獲未知錯誤
在開發中,要預判到所有可能出現的錯誤,有一定的難度
如果希望希望程序無論出現任何錯誤,都不會因爲Python解釋器拋出異常而被終止,可以再增加一個except
語法:
except Exception as result:
print(“未知錯誤 %s” % result)

完整格式:
try:
嘗試執行的代碼(可能會出錯的代碼)
except 錯誤類型1:

except 錯誤類型2:

except(錯誤類型3,錯誤類型4):

except Exception as result:
print(“未知錯誤 %s” % result)
else:

沒有異常纔會執行的代碼


finally:

無論如何都會執行的代碼

異常的傳遞
當函數執行出現異常,會將異常傳遞給函數的調用一方
如果傳遞到主程序,仍然沒有異常處理,程序纔會被終止
提示:
在開發中,可以在主函數中增加異常捕獲,如果主函數在調用其他函數出現異常,都會傳遞到主函數的異常捕獲中,這樣就不需要在代碼中,增加大量的異常捕獲,能夠保證代碼的整潔性

拋出raise異常
除了代碼執行錯誤Python解釋器會拋出異常之外,還可以根據應用程序特有的業務需求拋出異常
Python中提供了一個Exception異常類,在開發時,如果滿足特定的業務需求時,希望拋出異常,步驟:
1、創建一個Exception對象
2、使用raise關鍵字拋出異常對象
比如根據用戶輸入密碼,不符合規範,則拋出異常
exception=Exception(“您輸出的密碼不符合規範”)
raise exception

⑦模塊
模塊是Python程序架構的一個核心概念
每一個以擴展名爲 py 結尾的Python源代碼文件都是一個模塊
模塊名同樣也是一個標識符,需要符合標識符的命名規則
在模塊中定義的全局變量、函數、類都是提供給外界直接使用的工具
模塊就好比Java的工具包一樣,想要使用該工具包的工具,就先需要導入該工具包,即先導入該模塊
導入語法:
1、import 模塊名1,模塊名2
2、import 模塊名1
import 模塊名2
推薦導入多個模塊時使用第二種語法
通過 模塊名. 使用模塊提供的工具——全局變量、函數、類

如果模塊名字過長或者過於複雜,則可以使用 as 指定模塊的別名
import 模塊名1 as 模塊別名
注意:模塊別名應該符合大駝峯命名法

from …import 導入
如果希望從一個模塊中,導入部分工具,就可以使用from … import的方式
import 模塊名是一次性把模塊中所有工具全部導入
from 模塊名1 import 工具名
導入之後,不需要通過 模塊名. ,可以直接使用模塊提供的工具——全局變量、函數、類
注意:如果兩個模塊,存在同名的函數,那麼後導入模塊的函數,將會覆蓋掉先導入的函數。開發時import代碼應該統一寫在代碼頂部,更容易及時發現衝突;一旦發現衝突,也可以使用 as 關鍵字給其中一個工具起一個別名

from …import * 導入 (導入所有工具)
這種方式不推薦,因爲函數重名並沒有任何提示,出現問題不方便排插

模塊的搜索順序以及__file__屬性
Python的解釋器在導入模塊時,會
1、搜索 當前目錄 指定模塊名的文件,如果有就直接導入
2、如果沒有,再搜索系統目錄
在開發時,給文件起名,不要和 系統的模塊崇寧
Python中每一個模塊都有一個內置屬性 file 可以查看模塊的完整路徑
如果當前目錄有個 xxx.py,導入該 xxx.py 模塊時,會先加載當前目錄下的 xxx.py ,而不會加載系統中的 xxx.py

模塊擴展
一個獨立的Python文件就是一個模塊
在導入文件時,文件中所有沒有任何縮進的代碼都會被執行一遍
name 屬性
name 屬性可以做到,測試模塊的代碼,只在測試情況下被運行,而在被導入時不被執行
name 是Python的一個內置屬性,記錄這一個字符串
如果是被其他文件導入的,name 就是模塊名
如果是當前執行的程序,name 就是 main
一般開發中會看到下列格式的代碼:
def main():

if name==“main”:
main()

⑧包(Package)
包是一個包含多個模塊的特殊目錄
目錄下有一個特殊的文件 init.py
PyCharm新建 Python Package,會自動幫你生成__init__.py文件
包名的命名方式和變量名一樣,小寫字母+_

好處:使用import 包名 可以一次性導入包中所有的模塊

要在外界使用包中的模塊,需要在__init__.py中指定對外界提供的模塊列表
從當前目錄導入模塊名語法:
from . import 模塊名1
from . import 模塊名2

發佈模板
製作發佈壓縮包步驟:
1、創建setup.py
from distutils.core import setup

setup(name=“包名”, # 包名
version=“1.0”, # 版本
description=“描述信息”, # 描述信息
long_description=“完整描述信息”, # 完整描述信息
author=“作者”, # 作者
author_email=“作者郵箱”, # 作者郵箱
url=“主頁”, # 主頁
py_modules=[“包名.模塊名1”,
“包名.模塊名2”])

有關字典參數的詳細信息,可以參閱官方網站:https://docs.python.org/2/distutils/apiref.html
2、構建模塊
python3 setup.py build
3、生成發佈壓縮包
python3 setup.py sdist
注意:要製作哪個版本的模塊,就是用哪個版本的解釋器執行

安裝模塊
$ tar -zxvf 模塊名
$ sudo python3 setup.py install

卸載模塊
直接從安裝目錄下,把安裝模塊的目錄刪除就可以了(file 屬性可以查看模塊的完整路徑)
cd /usr/local/lib/python3.7/dist-packages/
sudo rm -r 模塊名*

pip安裝第三方模塊
第三方模塊通常是指由知名的第三方團隊開發的並且被程序員廣泛使用的Python 包 / 模塊
例如 pygame 就是一套非常成熟的 遊戲開發模塊
pip 是一個現代的,通用的 Python 包管理工具
提供了對 Python 包的查找、下載、安裝、卸載等功能
安裝和卸載命令如下:

將模塊安裝到 Python 2.x 環境

$ sudo pip install pygame
$ sudo pip uninstall pygame

將模塊安裝到 Python 3.x 環境

$ sudo pip3 install pygame
$ sudo pip3 uninstall pygame

⑧文件操作
計算機操作文件的步驟一般是:1、打開文件 2、讀/寫文件 3、關閉文件
操作文件
open >>> 打開文件,並且返回文件操作對線
read >>> 將文件內容讀取到內存
write >>> 將制定內容寫入文件
close >>> 關閉文件
open函數負責打開文件,並且返回文件對象
read/write/close三個方法都需要通過文件對象來調用

open函數
open函數的第一個參數是要打開的文件名(區分大小寫)
1、如果文件存在,返回文件操作對象
2、如果文件不存在,會拋出異常
read方法可以一次性讀入並返回文件的所有內容
close方法負責關閉文件

操作文件

打開文件

file = open(“文件名”)

讀取文件內容

text = file.read()
print(text)

關閉文件

file.close()

文件指針
文件指針標記從哪個位置開始讀取數據;第一次打開文件時,通常文件指針會指向文件的開始位置;當執行了read方法後,文件指針會移動到讀取內容的末尾;默認情況下會移動到文件末尾
如果執行了一次read方法,讀取完了所有內容,那麼在此調用read方法,將不能獲取到內容了,因爲文件指針已經移動到了文件末尾
注意:
1、如果忘記關閉文件,會造成系統資源消耗,而且會影響到後序對文件的訪問
2、方法執行後,會把文件指針移動到文件末尾

打開文件的方式
open函數默認以只讀方式打開文件,並且返回文件對象
語法:
file = open(“文件名”,“訪問方式”)

訪問方式 說明
r 以只讀方式打開文件。文件的指針將會放在文件的開頭,這是默認模式。如果文件不存在,拋出異常
w 以只寫方式打開文件。如果文件存在會被覆蓋。如果文件不存在,創建新文件
a 以追加方式打開文件。如果該文件已存在,文件指針將會放在文件的結尾。如果文件不存在,創建新文件進行寫入
r+ 以讀寫方式打開文件。文件的指針將會放在文件的開頭。如果文件不存在,拋出異常
w+ 以讀寫方式打開文件。如果文件存在會被覆蓋。如果文件不存在,創建新文件
a+ 以讀寫方式打開文件。如果該文件已存在,文件指針將會放在文件的結尾。如果文件不存在,創建新文件進行寫入
注意:頻繁的移動文件指針,會影響文件的讀寫效率,開發中更多的時候會以 只讀、只寫 的方式來操作文件

按行讀取文件內容
read方法默認會把文件的所有內容一次性讀取到內存;而且如果文件太大,對內存的佔用會非常嚴重
readline方法 可以一行一行讀取內容,方法執行後,會把文件指針移動到下一行,準備再次讀取

打開文件

file = open(“文件名”)
while True:
# 讀取一行內容
text = file.readline()
# 判斷是否讀到內容
if not text:
break
# 每讀取一行的末尾已經有了一個 \n
print(text, end="")
# 關閉文件
file.close()

複製文件
用代碼的方式,來實現文件複製過程
小文件複製步驟:
打開一個已有文件,讀取完整內容,然後寫入到新文件中

1. 打開文件

file_read = open(“源文件名”)
file_write = open(“新文件名”, “w”)

2. 讀取並寫入文件

text = file_read.read()
file_write.write(text)

3. 關閉文件

file_read.close()
file_write.close()

大文件複製步驟:
打開一個已有文件,逐行讀取內容,然後按順序寫入到新文件中

1. 打開文件

file_read = open(“源文件名”)
file_write = open(“新文件名”, “w”)

2. 讀取並寫入文件

while True:
# 每次讀取一行
text = file_read.readline()

# 判斷是否讀取到內容
if not text:
    break

file_write.write(text)

3. 關閉文件

file_read.close()
file_write.close()

文件/目錄常用管理操作
在 終端 / 文件瀏覽器、 中可以執行常規的 文件 / 目錄 管理操作,例如:創建、重命名、刪除、改變路徑、查看目錄內容等等
在 Python 中,如果希望通過程序實現上述功能,需要導入 os 模塊

文件操作
序號 方法名 說明 示例
01 rename 重命名文件 os.rename(源文件名, 目標文件名)
02 remove 刪除文件 os.remove(文件名)

目錄操作
序號 方法名 說明 示例
01 listdir 目錄列表 os.listdir(目錄名)
02 mkdir 創建目錄 os.mkdir(目錄名)
03 rmdir 刪除目錄 os.rmdir(目錄名)
04 getcwd 獲取當前目錄 os.getcwd()
05 chdir 修改工作目錄 os.chdir(目標目錄)
06 path.isdir 判斷是否是文件夾 os.path.isdir(判斷源)

文本文件的編碼格式
文本文件存儲的內容是基於 字符編碼 的文件,常見的編碼有 ASCII 編碼,UNICODE 編碼等
Python 2.x 默認使用 ASCII 編碼格式
Python 3.x 默認使用 UTF-8 編碼格式
ASCII 編碼
計算機中只有 256 個 ASCII 字符
一個 ASCII 在內存中佔用 1 個字節 的空間
8 個 0/1 的排列組合方式一共有 256 種,也就是 2的8次方

UTF-8 編碼格式
計算機中使用 1~6 個字節 來表示一個 UTF-8 字符,涵蓋了 地球上幾乎所有地區的文字
大多數漢字會使用 3 個字節 表示
UTF-8 是 UNICODE 編碼的一種編碼格式

Python 2.x 使用中文
在 Python 2.x 文件的 第一行 增加以下代碼,解釋器會以 utf-8 編碼來處理 python 文件

- coding:utf8 -(這方式是官方推薦使用的)

也可以使用:# coding=utf8

unicode 字符串
在 Python 2.x 中,即使指定了文件使用 UTF-8 的編碼格式,但是在遍歷字符串時,仍然會 以字節爲單位遍歷 字符串
要能夠 正確的遍歷字符串,在定義字符串時,需要 在字符串的引號前,增加一個小寫字母 u,告訴解釋器這是一個 unicode 字符串(使用 UTF-8 編碼格式的字符串)
比如,Python2.x中利用for循環遍歷字符串 “我愛你,世界!” 還是會亂碼,但是 u"我愛你,世界!" 就不會了

⑨eval函數
eval()函數可以將字符串當成有效的表達式來求值並返回計算結果
str=input(“計算器:”)
print(eval(str))
以上就寫成了一個簡單的計算器,只不過還有很多bug

千萬不要濫用eval
在開發時千萬不要使用eval直接轉換input的結果
比如eval轉換下列代碼
import(‘os’).system(‘ls’)
以上代碼等價於
import os
os.system(“終端命令”)
執行成功返回0;執行失敗,返回錯誤信息

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章