py 5.28
阿新 • • 發佈:2018-05-28
屬性。 stat one hide init ngs 其他 urn pan
#內置函數 #@property(偽裝):將一個本意是屬性的方法在調用時偽裝成直接調用屬性(方法名)的樣子來調用此函數。 # class A: # def __init__(self,r): # self.r = r # def area(self): # return self.r**2 # print(A(5).area())#變成 # class A: # def __init__(self,r): # self.r = r # @property # def area(self): # return self.r**2內置函數# print(A(5).area) #@被偽裝後的方法名.setter : 可以限制給對象的屬性賦值的數據類型。或是把偽裝後的函數名變成可修改的,變的 # 更像對象的屬性。 # class A: # def __init__(self): # self.__name = ‘zhangsan‘ # @property # def name(self): # return self.__name #把私有對象屬性返回給調用者。 # @name.setter #name為被偽裝之後# def name(self,new): #必須同名函數。 # self.__name = new #改值或其他操作。 # b = A() # print(b.name) #偽裝後的調用。 # b.name = ‘abc‘ #調用setter下面的函數,傳入new # print(b.name) #@方法名.deleter #所有借用操作系統的資源,在刪除一個偽裝或方法屬性的變量前,一定要歸還資源(f.close()) # class Open: # def __init__(self,path): # self.f = open(path,‘w‘)# @property # def write_in(self): #1 # self.f.write(‘xieru‘) # @write_in.deleter #2 # def write_in(self): #3 1/2/3的名字必須一樣。 # print(‘執行了刪除函數‘) # self.f.close() #先關閉文件(還回去) # del self.f #再刪除文件句柄 # b = Open(‘file.txt‘) # b.write_in # del b.write_in #觸發了 @f.deleter #@classmethod #用類調用。 當類中的方法用不上self這個參數時,將self變成cls(類),在外面直接用 類.方法名 調用即可。 # class A: # @classmethod # def func(cls): # print(‘這個函數不需要self‘) # A.func() #@staticmethod #用類調用。當類中的方法即用不上cls也用不上self時。相當於把一個外埠的函數放入類中使用。 # class A: # @staticmethod # def login(name): # if name == ‘alex‘: # print(‘通過‘) # A.login(‘alex‘)
#封裝 #私有靜態屬性:__靜態屬性 = ‘aaa‘ #只能在類內部使用,外面無法獲取。 # class A: # __name = ‘wangxiaoer‘ # 等同於 _A__name = ‘wangxiaoer‘ # print(__name) #內部使用 # print(__name) #無法獲取 #私有對象屬性。 # class A: # def __init__(self,length): # self.__length = length #只在類內部用來計算或其它操作,一般用來外部不需要獲取這個屬性值的情況 # def cal(self): # return self.__length*2 # print(A(5).cal()) #私有方法: def __name(self): #1、某些方法不想讓在外部被調用。比如:密碼加密。 # 2、某些方法不需要在外部調用,沒有用,沒有意義。比如各個數據類型的內部操作方法。 # class A: # def __getpwd(self): # print(‘我是私有方法‘) # def login(self): #login是可以在外面被調用的,在外面調用登陸方法 # self.__getpwd() #然後執行登陸函數中的getpwd方法。(屬於在內部執行) # A().login() # A().__getpwd() #出錯 #私有方法面試題 # class Role: # def __init__(self): #子類中沒有找到__init__方法,往父類中找。 # self.__func() #第三步,找到後往下執行。尋找__func方法,實則是查找_A__func方法 # def __func(self): #第五步,應該執行此函數(_A__func) # print(‘我是父類中的方法‘) # class Person(Role): #第二步,找到對應類,並找__init__方法。 # def __func(self): #第四步,先在自己類中找__func,發現是_B__func方法,不符合。 # print(‘我是子類中的方法‘) # Person() #第一步:實例化一個對象封裝
#鉆石繼承(廣度優先) # A # B(A) C(A) # D(B,C) 查找順序:D--->B-->C-->A # class A: # def func(self): # print(‘in A‘) #4.A # class B(A): # def func(self): # print(‘in B‘) #2.B # super().func() # class C(A): #3.C # def func(self): # print(‘in C‘) # super().func() # class D(B,C): #廣度優先原則,B找完再找C,不直接找A # def func(self): # print(‘in D‘) #1.D # super().func() # D().func() #第二種:(類似深度優先) # E F # B(E) C(F) # D(B,C) #查找順序:D-->B-->E-->C-->F (類似深度優先,以路徑最短為主。) # class E:pass # def func(self): # print(‘in E‘) # class F: # def func(self): # print(‘in F‘) # class B(E):pass # # def func(self): # # print(‘in B‘) #首先路線為D-->B-->E # # super().func() # class C(F): # def func(self): # print(‘in C‘) #如果B和E中都沒有,則路線為D-->C-->F # super().func() # class D(B,C): # def func(self): # print(‘in D‘) # super().func() # D().func() #第三種 # A # E(A) F(A) # B(E) C(F) # D(B,C) 查找順序:D-->B-->E-->C-->F-->A (找到E的時候不直接找A,因為還有另一條路線可以找到A) #查看查找順序的方法:類名.mro() # print(D.mro()) #super()查找順序與mro一致 #新式類:基於object的類,遵循廣度優先原則。 #經典類:不基於object的類,遵循深度優先原則。 #py2中需要定義父類為object之後才能變成新式類。py3中默認最高層都是基於object的,所以全部都是新式類。鉆石繼承
py 5.28