一. 類
在 Python 中,所有數據類型都可以視爲對象,當然也可以自定義對象,自定義的對象數據類型就是面向對象中的類(Class)。object表示該類是從哪個類繼承下來的,如果沒有合適的繼承類,就使用 object 類,這是所有類最終都會繼承的類
1. 定義一個類
注:類名後面有括號的類,稱爲新式類,括號裏面的內容是父類的名稱;程序中所有類的父類都是 object
2. 類的數據屬性
注:name,age均爲類的數據屬性;print Animals.name和print Animals.age爲訪問類的數據屬性
3. 類的方法
1>類的方法 ==== 函數
2>在類中定義的函數叫做方法
3>類的方法中,python 解釋器要求第一個形參必須是 self ;與 java 中的 this 類似
4>self 實質上是類實例化後的對象本身
5>類的實例化產生的就是對象:object;;把抽象的類創造出實際存在的事物
注:在 Python 中,實例的變量名如果以 __ 開頭,就變成了一個私有變量
二. 面向對象的特性:封裝, 繼承, 多態
1>面向對象編程——Object Oriented Programming,簡稱 OOP,把對象作爲程序的基本單元,一個對象包含了數據和操作數據的函數
2>面向過程把函數繼續切分爲子函數,來降低系統的複雜度
1. 封裝
封裝實際上是把數據封裝到某個地方,以後再去調用被封裝在某處的內容或者數據
1>封裝數據
2>調用封裝數據:通過對象直接調用;通過self間接調用
eg:
創建一個類People,擁有的方法爲砍柴,娶媳婦,回家:
實例化對象,執行相應的方法,顯示如下:
張三,18歲,男,上山去砍柴
李四,22歲,男,開車去娶媳婦
趙六,10歲,女,輟學回家
屬性:name,age,gender
方法:gohome(),kanchai(),quxifu()
注:對象可以實例化多個
附1:桟的數據結構
測試:
附2:隊列的數據結構
測試:
2. 繼承
父類和子類,又叫 基類和派生類
注:子類Dog和Cat分別繼承了父類Animals的屬性和方法,並且保留自己的屬性和方法
2.1 重新父類的構造方法
第一種:
第二種:父類名.__init__(self,形參)
第三種:super(自己類的名稱, self).__init__(形參)
優點:
<1>不需要明確告訴父類的名稱
<2>如果父類改變,只需修改class語句後面的繼承關係即可
2.2 新式類和經典類
1>python2.x裏面支持經典類和新式類
2>python3.x裏面僅支持新式類
2.3 多重繼承
新式類:
按照廣度優先算法,具體爲先在整層或者同級別搜索,再深入一層或級別搜索:A--->B(C)---D
經典類:
按照深度優先算法,具體爲先由淺到深,再返回與之開始時同一層或級別搜索:A---B--->D--->C--->D
3. 多態
當父類和子類有相同的方法時, 調用優先執行子類的方法
三. 特殊的類屬性
執行結果:
print Animals.__module__
如果類不是被導入的, 顯示爲 __main__;如果類是被 import 導入的, 則顯示類所在的模塊名
四. 類屬性
五. 實現查看類實例化對象的個數
六. 類方法和靜態方法
1. 類方法
1.1 普通方法---第一個參數必須是 self( 對象 )
1.2 類方法---第一個參數是 cls( 類 )
2. 靜態方法---不需要加特殊的第一個參數
七. property屬性
property屬性作用:
1>property可以定義一個方法名爲私有屬性的名字, 讓用戶可以訪問, 但不能修改, 保護數據的安全性
注1:在類裏邊,以雙下劃線開頭的屬性,只在類裏邊生效,外部調用不生效
注2:python 解釋器將 self.__ 屬性名間接轉換爲 self._ 類名 __ 屬性名self.__score = score
2>@屬性名.setter在給屬性賦值時, 先做判斷
eg1:
eg2:
測試:
附:私有成員和共有成員
1>私有屬性/方法: 類內部可以訪問, 對象不能訪問; 子類不能訪問, 子類的對象不能訪問
2>共有屬性/方法: 私有屬性可以訪問和不可以訪問的, 都可以訪問
3>@屬性名.deleter使用內置del刪除屬性時,自動執行的內容
附:property(fget, fset, fdel, fdoc)方法:
eg:property應用:信息分頁顯示
a.主機信息有很多, 爲了美觀, 分頁顯示
b.當用戶選擇第n頁, 顯示該頁需要的數據從哪條開始, 哪條結束
c.將start, end返回給後端, 將需要的數據響應給前端
property屬性前:
property屬性後:
八. 特殊的實例方法
注:call當調用對象時自動執行
1. 改變類的字符串顯示 __str__ 和 __repr__
功能: 簡化腳本測試和調試時的實例輸出
1>__str__ : 當打印對象時自動調用
2>__repr__ : 當在交互式環境中, 直接輸入對象時, 自動調用
3>如果 __str__ 沒有定義時, 那麼打印對象自動調用 __repr__
4>如果 __repr__ 沒有定義時
2. 自定義字符串的格式__format__
3. 索引:__getitem__ 和 __setitem__ 和 __delitem__
eg:
4. 切片: __getslice 和 __setslice__ 和 __delslice__
5. 類支持比較操作(<, <=, ==, !=, >, >=)
eg:房子與屋子
測試:
6. 迭代 __iter__
九. 元類(type)
在python中,一切皆對象; Linux下一切皆文件
注:Student 是個類, 實質上是個對象,Student 類是 type 類的一個實例化
1. 創建類
2. type動態創建類
1>type(對象)
2>type(類名, 元組方式存儲父類,屬性 )
十. with語句(語句上下文管理)
注:分析with語句底層發生了什麼?
1>調用 __enter__ 方法, 返回的是文件對象
2>將文件對象起別名爲f
3>運行完之後, 調用之前暫存 __exit__ 方法, 實現關閉文件
附:
linux使用工具:psutil
yum search python | grep devel
yum install -y python-devel.x86_64
pip install psutil
psutil應用: