装饰器
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