封裝:隱藏屬性或方法,外部沒法使用,內部可使用,在類定義階段就執行了,真的想引用,就使用_類名__屬性名
#好比 class YwY: __name = 1 #其等同於作了這一層處理_YwY__name = 1 a = YwY() print(a.__name) #會報錯,類外面無法直接引用類裏面隱藏的變量 #咱們若是直接用類來引用這個變量 #全部咱們真的要拿裏面的變量的話 prnt(a._YwY__name) # 隱藏模塊內的函數/變量_x:from module import *(沒法導入), from module import _x(不合理) 如 class YwY: def __func():#其等同於作了這一層處理def _YwY__func() pass #封裝後咱們要在類內部使用封裝後的變量或者變量名,咱們能夠直接導入他的變量名或者函數名便可 class YwY: __name = 1 def __one(self): print('1') def __two(self): print('1') def func(self): print(self.__name) self.__one() self.__two() a = YwY() a.func()
# @property:被 @property 裝飾的函數會從函數變成屬性,也就是說直接.函數名,不須要加括號使用 #以下 class Func: @property def a(self): print('1') a = Func() a.a #1
# @方法名.setter:被 @方法名.setter 裝飾的函數裝飾函數名字必須和方法名字相同,方法名修改,會執行這個裝飾的函數, #coding=utf-8 # ############### 定義 ############### class Goods: """python3中默認繼承object類 以python二、3執行此程序的結果不一樣,由於只有在python3中才有@xxx.setter @xxx.deleter """ @property #方法必須先進行@property def price(self): print('@property') @price.setter def price(self, value): #函數名必須和方法相同 print('@price.setter') @price.deleter def price(self): print('@price.deleter') # ############### 調用 ############### obj = Goods() obj.price # 自動執行 @property 修飾的 price 方法,並獲取方法的返回值 obj.price = 123 # 自動執行 @price.setter 修飾的 price 方法,並將 123 賦值給方法的參數 del obj.price # 自動執行 @price.deleter 修飾的 price 方法
因爲新式類中具備三種訪問方式,咱們能夠根據它們幾個屬性的訪問特色,分別將三個方法定義爲對同一個屬性:獲取、修改、刪除python
# 對象的綁定方法:沒有加任何裝飾的方法就是對象的綁定方法 # 類的綁定方法:加了@classmethod裝飾器的方法就是類的綁定方法,裏面的形參必須是cls而不是self,約定俗稱 # 非綁定方法:加了@staticmethod裝飾器的方法就是非綁定方法,其實就是一個普通的函數,裏面的self沒有意義
經典類是深度優先函數
新式類是廣度優先code