文章參考:
Python 物件導向(初級篇)
python 物件導向(進階篇)
Python 是一門物件導向的語言。本文是物件導向編程的初級篇,僅介紹封裝,不涉及繼承和多態。鑒於C++也是一門物件導向的語言,裡面有很多相通之處。
類的成員
類的成員可以分為三大類:變數、方法 和 屬性
變數 普通變數屬於對象 靜態變數屬於類,即不管執行個體化了多少個對象,靜態變數只有一份
class student: # 靜態變數 type = "human" def __init__(self, id, name): # 普通變數 self.id = id self.name = name# 訪問靜態變數print(student.type)# 訪問普通變數s = student(3, "mick")print(s.name)print(s.type) # 靜態變數也可以由對象訪問
方法 普通方法:由對象調用,至少一個self參數,執行普通方法時,自動將調用該方法的對象賦值給self 類方法:由類 或 對象 調用,至少一個cls參數,執行類方法時,自動將調用該方法的類複製給cls 靜態方法:由類 或 對象 調用,無預設參數
class student: type = "human" def __init__(self, id, name): self.id = id self.name = name # 普通方法 def show(self): print("id: {0}\t name: {1}".format(self.id, self.name)) # 類方法 @classmethod def another_init(cls, id, name): return cls(id, name) # 靜態方法 @staticmethod def Hello(): print("Hello")s = student.another_init(3, "mick")s.show()s.Hello()student.Hello()
相同點:三種方法都歸屬於類,記憶體上只有一份。
不同點:三種方法的區別在於傳入的參數不同,普通方法一定要對象來調用,因為普通方法的第一個參數是對象本身,類方法 和 靜態方法 既可以用對象調用,也可以用類直接調用,它倆的區別在於類方法還會傳入將類作為參數傳入,而靜態方法則沒有必須要傳入的參數。
屬性
Python 中的屬性其實是普通方法的變種,調用時:無需括弧,像是訪問變數一樣
屬性的定義方式 裝飾器:在方法上應用裝飾器 靜態變數方式:在類中定義值為property對象的靜態變數
Python3 取消了經典類,只有新式類。
一、裝飾器方式:@property、@方法名.setter、@方法名.deleter
class student: def __init__(self, id, name): # 普通變數 self.id = id self.name = name @property # 由property裝飾,這個類方法變為讀屬性 def myname(self): return self.name @myname.setter # 由setter裝飾,這個類方法變為寫屬性 def myname(self, name): self.name = name @myname.deleter # 由deleter裝飾,這個類方法變為寫屬性 def myname(self): del self.names = student(3, "mick")print(s.myname)s.myname = "chen"print(s.myname)del s.myname
二、靜態變數方式:構造 property 對象
class student: def __init__(self, id, name): # 普通變數 self.id = id self.name = name def get_name(self): return self.name def set_name(self, name): self.name = name def del_name(self): del self.name # 參數依次對應擷取,設定,刪除 myname = property(get_name, set_name, del_name)s = student(3, "mick")print(s.myname)s.myname = "chen"print(s.myname)del s.myname
類成員許可權
分為兩種: 公有成員:在任何地方都可以訪問 私人成員:在類的內部才可以訪問,命名時前兩個字元是底線
私人成員通過 對象. _ 類名 __ 變數名 可以強制訪問
class student: # 靜態變數 type = "human" __sex = "male" def __init__(self, id, name): # 普通變數 self.__id = id self.name = name def show(self): print(student.type, student.__sex, self.__id, self.name)class postgraduate(student): def show(self): print(student.type, self.name)s = student(3, "mick")# 父類s.names.types._student__ids._student__sexs.show()# 子類p = postgraduate(1, "hwdtc")p.namep.typep._student__idp._student__sexp.show()