1. 程式人生 > >python學習之-propetry裝飾器

python學習之-propetry裝飾器

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