python面向?qū)ο蟪绦蛟O(shè)計(OOP)
-
類定義語法
class className:
在python中可以使用內(nèi)置方法isinstance()來測試一個對象是否為某個類的實例。 -
self參數(shù)
類的所有實例方法都必須至少有一個名為self的參數(shù),并且必須是方法的第一個參數(shù),self參數(shù)代表對象本身。在類的實例方法中訪問實例屬性時需要以self為前綴,但在外部通過對象名調(diào)用對象方法時并不需要傳遞這個參數(shù),如果在外部通過調(diào)用對象方法則需要顯示為self參數(shù)傳值。
-
類成員與實例成員
實例屬性:在構(gòu)造函數(shù)
__init__()中定義,定義和使用時必須以self作為前綴。類屬性:是在類中所有方法之外定義的數(shù)據(jù)成員。
在主程序,實例屬性屬于實例(對象),只能通過對象名訪問;而類屬性屬于類,可以通過類名和對象名訪問。
python特有的動態(tài)類型特點:可以動態(tài)地為類和對象增加成員。
實例對象.外加方法 = types.MethodType(方法,類) -
私有成員與公有成員
用下劃線作為變量名和方法名前綴和后綴來表示類的特殊成員。
*_xxx:這樣的對象叫做保護成員,不能用"from module import ",只有類對象和子類對象能訪問這些成員。
*__xxx__:系統(tǒng)定義的特殊成員。
*__xxx:類中私有成員,只有類對象自己能訪問,子類對象也不能訪問到這個成員,但在對象外部可以通過對象名._類名__xxx*這樣的特殊方式訪問。
-
方法:
-
公有方法,私有方法,靜態(tài)方法,類方法。
公有方法,私有方法屬于對象,私有方法的名字以"__"開始,每個對象都有自己的公有方法和私有方法,在這兩類方法中可以訪問屬于類和對象的成員。
公有方法通過對象名直接調(diào)用,私有方法不能,只能在屬于對象的方法中通過self調(diào)用或在外部通過python支持的特殊方式來調(diào)用。如果通過類名來調(diào)用屬于對象的公有方法,需要顯示為該方法的self參數(shù)傳遞一個對象名,用來明確指定訪問哪個對象的數(shù)據(jù)成員。
靜態(tài)方法和類方法都可通過類名和對象名調(diào)用,但不能直接訪問屬于對象的成員,只能訪問屬于類的成員。一般將cls作為類的第一個參數(shù)名稱,并且在調(diào)用類方法時不需要為該參數(shù)傳遞值。
class classname: @classmethod #類方法 def classmethod(cls): @staticmethod #靜態(tài)方法 def … -
-
屬性
在python2.x中,使用@property或property()函數(shù)來聲明一個屬性(把一個方法變成屬性調(diào)用),然而屬性并沒有得到真正意義的實現(xiàn),也沒有提供應(yīng)有的訪問保護機制,為對象增加新的數(shù)據(jù)成員時,將隱藏同名的已有屬性。
-
繼承機制
在繼承關(guān)系中,已有的設(shè)計好的類稱為父類或基類,新設(shè)計的類稱為子類或派生類。派生類可以繼承父類的公有成員,但是不能繼承其私有成員。如果需要在派生類中調(diào)用基類的方法,可以使用內(nèi)置函數(shù)
super()或通過基類名.方法名()的方式來實現(xiàn)。
python支持多繼承,如果父類中有相同的方法名,而在子類中使用時沒有定義父類名,則python解釋器將從左至右按順序搜索