python學習之-propetry裝飾器
阿新 • • 發佈:2018-12-16
propetry是一個內建函式,用來將一個功能偽裝成一個數據屬性
property將一個方法偽裝成一個數據屬性
class People:
def __init__(self,name,height,weight):
self.name=name
self.height=height
self.weight=weight
@property
def bmi(self):
return self.weight / (self.height ** 2)
obj=People('egon',1.8,70)
obj.height=1.81
obj.weight=69
# print(obj.bmi()) #沒有偽裝前是這樣呼叫的
print(obj.bmi) #偽裝後是這樣呼叫的
例:將一個介面偽裝成資料屬性
class People:
def __init__(self,name):
self.__name=name
@property
def name(self):
return self.__name
print(name) #將一個介面偽裝成一個數據屬性讓使用者呼叫
例:檢視、修改和刪除介面
class People:
def __init__(self,name):
self.__name=name
@property
def name(self): #這個功能函式是被property裝飾過的
return self.__name
@name.setter #這裡就可以以被裝飾函式為起始名寫一個setter修改介面
def name(self,val):
if type(val) is not str:
print('名字必須是str型別')
return
self.__name=val
@name.deleter #這裡就可以以被裝飾函式為起始名寫一個deletery刪除介面
def name(self):
print('不讓刪除')
obj=People('egon')
print(obj.name)
obj.name='EGON' #呼叫了修改介面,修改了name的值
print(obj.name)
del obj.name #呼叫刪除介面
print(obj.name)
PS:但凡被propetry裝飾的函式,後面都可以以函式名為起始呼叫(@name.setter 修改/ @name.deleter 刪除)
PS:setter對應的就是修改屬性,deleter對應的就是刪除操作,propetry對應的就是檢視操作
舊的寫法
class People:
def __init__(self,name):
self.__name=name
def get_name(self):#這裡函式名沒有限制,但是一般都是標識性的名字
return self.__name
def set_name(self,val):
if type(val) is not str:
print('名字必須是str型別')
return
self.__name=val
def del_name(self):
print('不讓刪除')
name=property(get_name,set_name,del_name) #這裡括號裡的必須是按照檢視、修改、刪除排序,必須按照順序,而且返回值不能亂賦值,必須賦值給對應的屬性
obj=People('egon')
obj.name
obj.name=123
del obj.name