1. 程式人生 > >py 5.28

py 5.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