Python面向對象編程-初級篇
前言
面向對象 : 采用基于對象(實體) 的概念建立模型,模擬客觀世界分析、設計、實現軟件的辦法。面向對象編程(Object-oriented Programming,簡稱 OOP)是一種解決軟件復用的設計和編程方法,把軟件系統中相近相似的操作邏輯和操作應用數據、狀態,以類的形式描述出來,以對象實例的形式在軟件系統中復用,提高軟件開發效率。
面向對象編程是Python中一個極為重要的概念。
一、面向對象和面向過程
1.兩類軟件開發設計方法
- 面向過程編程:根據業務邏輯從上往下,將需要用到的功能代碼封裝到函數中,著重關注開發的步驟和過程,典型代碼為C語言(關注過程)
- 面向對象編程:將函數或所需要的功能進行分類和封裝,著重關注具體哪個類和函數來實現功能,典型代碼為Java、C++等語言(關注結果)
2.面向對象相關術語
- 類(Class):用來描述具有相同屬性和方法的對象的集合,它定義了該集合中每個對象所共有的屬性和方法,對象是類的實例。
- 實例:也稱對象。通過類定義的初始化方法,賦予具體的值,成為一個”有血有肉的實體”。
- 類變量:類變量在整個實例化的對象中是公用的。類變量定義在類中且在函數體之外。類變量通常不作為實例變量使用。
- 數據成員:類變量或者實例變量, 用于處理類及其實例對象的相關的數據。
- 方法重寫:如果從父類繼承的方法不能滿足子類的需求,可以對其進行改寫,這個過程叫方法的覆蓋(override),也稱為方法的重寫。
- 局部變量:定義在方法中的變量,只作用于當前實例的類。
- 實例變量:在類的聲明中,屬性是用變量來表示的。這種變量就稱為實例變量,是在類聲明的內部但是在類的其他成員方法之外聲明的。
- 方法:類中定義的函數。
- 方法重寫:如果從父類繼承的方法不能滿足子類的需求,可以對其進行改寫,這個過程叫方法的覆蓋(override),也稱為方法的重 寫。
- 靜態方法:不需要實例化就可以由類執行的方法。
- 類方法:類方法是將類本身作為對象進行操作的方法。
面向對象三大特性:
- 封裝:將內部實現包裹起來,對外透明,提供api接口進行調用的機制。
- 繼承:即一個派生類(derived class)繼承父類(base class)的變量和方法。
- 多態:根據對象類型的不同以不同的方式進行處理。
二、類和對象
1.對象
對象是面向對象編程的核心,在使用對象過程中,為了將具有共同特征和行為的一組對象抽象定義,形成類
2.類
1)概念
類是一類事物,對象即是這一類事物的具體實現,類具有相同的屬性和行為
2)類(class)的組成
- 類名:類的名稱
- 屬性:事物的特征
- 方法:具體做什么
3)抽象
擁有相同或類似屬性和行為的對象都可以抽象成一個類
4)類的分類
創建類使用class關鍵字,帶上類名,再帶上括號,括號內為object,這樣的類稱為:新式類;也可以不帶括號和括號內的object,這樣的類稱為:經典類。
5)創建對象
6)self
類方法的第一個參數必須是self(按慣例是self,也可以是其他名稱),調用時不必傳入。self代表類的實例
三、獲取或添加對象屬性
如下有個名為meeting的類,類中初始化了name、age、sex、address、attack等屬性,定義了introduction和attacked兩個方法:
1.hasattr-檢查對象是否包含指定屬性或方法
用法:
hasattr(object,name)
作用:檢查對象中是否包含指定屬性或方法
返回值:存在返回true、不存在返回false
2.getattr-獲取對象中指定屬性的屬性值
用法:
getattr(object,name[,default])
作用:獲取對象中指定屬性的屬性值
返回值:若存在,則返回該屬性的屬性值;若不存在,則返回指定內容
打印結果如下:

3.setattr-為object對象的name屬性設置指定value
用法:
setattr(object,name,value)
作用:為object對象的指定屬性設置指定value
返回值:
打印結果如下:

四、魔法方法
1.__init__() 構造函數
__init__()方法是Python中一種特殊的方法,被稱為構造函數或初始化方法,當創建這個類的實例時就會調用該方法。
2.__del__() 析構函數
當刪除對象時,Python解釋器會默認調用一個方法__del__(),相當于unittest框架中的tearDown()函數
每調用一次對象,都會執行一次__del__()方法

3.引用計數
D對象的引用計數為2次,一次是D引用,一次是sys.getrefcount所引用的
4.__str()__字符串函數
__str__方法需要返回一個字符串,當做這個對象的描述信息,當使用print輸出對象的時候,只要定義了__str__(self)方法,那么就會打印這個方法返回的數據
- 未定義__str__()方法時,打印對象,打印的是Meeting類的內存地址:<__main__.Meeting object at0x014A7748>
- 定義了__str__()方法后,打印對象,打印的是__str__()方法的返回值:我是Meeting類的字符串描述
五、Python的內置屬性
1.__dict__:獲取類的屬性
獲取類的屬性,包含一個字典,由類的數據屬性組成
2.__doc__:獲取類的文檔字符串
3.__name__:獲取類名
4.__module__:類定義所在的模塊
類的全名是'__main__.clssName',如果類位于一個導入模塊mymod中,那么className.__module__等于mymod
Meeting類的路徑為__main__,而從common文件的http_requests文件中導入了HttpRequests類,打印其路徑,則為common.http_requests
5.__bases__:獲取類的所有父類構成元素
獲取類的所有父類構成元素(包含了一個由所有父類元素組成的元組)。例如下面有一個Song類,其繼承了父類Music,則獲取到的Song類的所有父類構成元素為:(<class '__main__.Music'>,)
小結
本篇文章我們介紹了面向對象的相關概念,下面來簡單總結一下:
面向對象相關概念:
- 類和對象:類是一類事物,對象即是這一類事物的具體實現,類具有相同的屬性和行為;
- 類的組成:類名、屬性、方法
- 帶object的為新式類,不帶object的為經典類
獲取或添加對象屬性:
- hasattr:檢查對象是否包含指定屬性或方法
- getattr:獲取對象中指定屬性的屬性值
- setattr:為object對象的name屬性設置指定value
魔法方法:
- __init__() 構造函數:又叫初始化方法,用來初始化一些成員變量
- __del__() 析構函數:每調用一次對象,都會執行一次__del__()方法,相當于Unittest框架中的tearDown
- __str()__字符串函數:返回一個字符串,當做這個對象的描述信息
Python內置屬性:
- __dict__:獲取類的屬性,返回值為字典類型
- __doc__:獲取類的文檔字符串
- __name__:獲取類名
- __module__:類定義所在的模塊
- __bases__:獲取類的所有父類構成元素,返回類型為元組























