python——装饰器和@property装饰器

装饰器

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.5­23.9 过重:24­27 肥胖:28­32 非常肥胖, 高于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

你可能感兴趣的:(python,函数闭包,property)