裝飾器
1、裝飾器函數的本質:一個閉包函數
2、裝飾器函數的作用: 在不修改原函數及其調用方式的情況下對原函數功能進行擴展
3、語法糖 格式:@裝飾器名稱
4、創建帶返回值的裝飾器
5、創建傳遞參數的裝飾器
6、裝飾器的固定格式
def wrapper(f):
def inner(*args,**kwargs):
ret=f(*args,**kwargs)
return ret
return inner
@wrapper
def fun(*args,**kwargs):
print("zzz")
7、解決被裝飾函數不能查看信息bug 導入wraps from functools import wraps @wraps(func)
8、添加多個裝飾器
格式:
@wrapper1
@wrapper2
def f(): 執行原理:先執行距離函數近的裝飾器@wrapper2
練習:
import time
def timer(func):
def inner():
start=time.time()
time.sleep(0.1)
ret=func()
end=time.time()
print("程序運行的時間{}".format(start-end))
return ret
return inner
@timer
def fun():
print("華晨宇演唱會")
return "你去了沒"
ret=fun()
print(ret)
結果:
華晨宇演唱會
程序運行的時間-0.1094198226928711
你去了沒
@property裝飾器
1、@property 內置裝飾器函數,把一個方法調用方式變成屬性調用方式。(將一 個方法當成一個屬性使用)。注意@property裝飾器只能在面向對象中使用。
2、訪問使用@property裝飾器裝飾的函數可以直接調用函數名 (會執行一段功能(函數)然後返回值)
3、@property 裝飾器只能修飾不帶參數的方法。
4、@property裝飾器修飾私有方法的getter和setter方法。和控制屬性的訪問權 限只讀。
練習:
class Person:
def __init__(self,name,age):
self.__name=name
self.__age=age
@property
def name(self):
return self.__name
@property
def age(self):
return self.__age
@age.setter
def age(self,age):
return self.__age
@age.setter
def age(self,age):
if age<=0 or age>150:
print("火星來的吧")
return
else:
self.__age=age
person=Person("zs",17)
person.age=31
print(person.age)
結果:
31
練習2:
BMI指數計算 成人的BMI數值: 過輕:低於18.5
正常:18.523.9 過重:2427 肥胖:2832 非常肥胖, 高於32 體質指數(BMI)=體重(kg)÷身高^2(m) EX:70kg÷(1.75×1.75)=22.86
class Person:
def __init__(self,name,weight,height):
self.name=name
self.weight=weight
self.height=height
@property
def bmi(self):
return self.weight/(self.height**2)
@bmi.setter
def bmi(self,bmi):
if bmi>18.5 and bmi<23.9:
print("正常")
else:
bmi="18.5---23.9"
print("不正常,bmi應該在{}".format(bmi))
people=Person("as",80,1.65)
people.bmi=40
print(people.bmi)
結果:
不正常,bmi應該在18.5---23.9
29.384756657483933