python 【面向對象程序設計】
?類的所有實例方法都至少有一個self參數,且 self 必須是方法的第一個參數(如果有多個參數的話),self 代表將來要創建的對象本身。
■在Python,將實例方法的第一個參數定義為 self 只是一個習慣。實際上,不是一定要用 self 來表示將來創建的對象,可以自己取定。
1 class Dog: 2 def __init__(nself,name): 3 nself.name=name; 4 def info(self): 5 print(self.name) 6 7 d=Dog("大黃") 8 d.info()
?類的屬性有兩類:實例屬性、類屬性。實例屬性(也稱:靜態屬性)是在構造方法__init__中定義的,因為實例屬性是在對象創建時才會分配空間,所以定義和類內使用都要以self或類名為前綴,類外使用以對象名為前綴。類屬性(也稱:對象屬性)是定義在所有方法之外的,類內使用以self或類名為前綴,類外使用以對象名或類名為前綴。
■在Python中比較特殊的是,可以在類和對象都創建完成後,動態向類中增加新的屬性和方法,俗稱混入(mixin)機制。 這就是Python的動態性。 如何增加呢?增加新的屬性:對象名 . 新屬性=value。增加新方法:import types 對象名 . 新方法名 = types . MethodType(新方法名,對象名)
car1 = Car("Red") #實例化對象 car2 = Car("Blue") print(car1.color, Car.price) #查看實例屬性和類屬性的值 Car.price = 110000 #修改類屬性 Car.name = ‘QQ‘ #動態增加類屬性 car1.color = "Yellow" #修改實例屬性 print(car2.color, Car.price, Car.name) print(car1.color, Car.price, Car.name)
?靜態方法
① 用@staticmeth
②=“ 定義在類中的全局函數”
③可以無參數,若有參數,不會將第一個參數看做調用對象。
④調用方式為:a.)類名.靜態方法名 b.) 對象名.靜態方法名
類方法
①用@classmethod裝飾器修飾,第一個參數cls是當前類。
②調用方式為:a.)類名.靜態方法名 b.) 對象名.靜態方法名
?定義時,有“__”前綴的成員是私有成員。在類內以“self.__”的形式調用,類外則無法直接訪問,但可以通過[1]公有成員方法和[2]Python特殊方式間接訪問。
E: [1] def info(self,value) [2] 對象名 . _類名__私有成員
return self.__value a._A__value
而定義時,無下劃線前綴的成員是公有成員。在類內以“self.__”的形式調用,類外以“對象名 . 成員名”的形式訪問。
?私有方法和公有方法的定義與相應成員的定義相似。
■在Python中,以下劃線開頭的變量名和方法名有特殊的含義,尤其是在類的定義中。用下劃線作為變量名和方法名前綴和後綴來表示類的特殊成員:
_xxx:受保護成員,不能用‘from module import *‘導入;
__xxx__:系統定義的特殊成員; 定制類???
__xxx:私有成員
?@property,property意思是“屬性”,功能是代替set、get方法。
E:
1 class B: 2 def __init__(self,atr): 3 self.__atr=atr 4 5 @property #代替getAtr方法 6 def atr(self): 7 print("property輸出裝飾器被調用") 8 return self.__atr 9 10 @atr.setter #代替setAtr方法 11 def atr(self,newAtr): 12 self.__atr=newAtr 13 14 if __name__=="__main__": 15 b=B("20") 16 17 print(b.atr) 18 """ atr為私有屬性,無法在類外直接訪問,但第15行語句能執行 19 通過輸出語句“property輸出裝飾器被調用”可知是property的作用效果 20 """ 21 b.atr=30 22 print(b.atr) 23 print(b._B__atr)
python 【面向對象程序設計】