装饰器
作用:在不改变原有函数的源代码的情况下,给函数增加新的功能(符合了开发中的封闭开放原则)
本质是闭包
例子:
def check(fn): def inner(): print('登陆验证') fn() return inner def comment(): print('发表评论') comment = check(comment) comment()
结论:装饰器就是把一个函数当作参数传递给闭包中的外部函数,同时在内部函数中使用这个函数,并给它添加新的功能
装饰器语法糖
@装饰器名称,可以完成对已有函数的装饰操作。
装饰器的使用
import time def check(fn): def inner(): start = time.time() fn() end = time.time() print('花费了', end - start, '秒') return inner @check def func1(): for i in range(1000): print(i) func1()
装饰带有参数的函数
def logging(fn): def inner(a, b): print('logging......') fn(a, b) return inner @logging def add(a, b): result = a + b print(result) add(2, 3)
装饰带有参数的函数
def logging(fn): def inner(a, b): print('logging......') result = fn(a, b) return result return inner @logging def add(a, b): result = a + b return result result = add(2, 3) print(result)
通用装饰器
接受不定长参数和关键字参数,如果有return则return result,没有就返回空
多个装饰器装饰一个函数
def logging(fn): def inner(*args, **kwargs): print('logging......') result = fn(*args, **kwargs) return result return inner def check(fn): def inner(*args, **kwargs): print('check......') result = fn(*args, **kwargs) return result return inner @check @logging def comment(): print('发表评论') comment()
结论:离函数近的装饰器先装饰,然后外面的装饰器在装饰,由内到外的装饰过程
带有参数的参数器
def logging(flag): def decorator(fn): def inner(num1, num2): if flag == '+': print('正在执行加法运算') elif flag == '-': print('正在执行减法运算') result = num1 + num2 return result return inner return decorator @logging('+') #先执行logging('+')给flag赋值为'+',然后返回值为decorater,相当于变成了@decorator def add(a, b): result = a + b return result result = add(1, 2) print(result)
类中call方法的使用
一个类一旦实现了_call_方法,那么这个类创建的对象就是一个可调用对象,可以向函数一样进行调用。
class Check(object): def __call__(self, *args, **kwargs): print('我是call方法') c = Check() c()
类装饰器
class Check(object): def __init__(self, fn): self._fn = fn def __call__(self, *args, **kwargs): print('检查') self._fn() @Check # comment = Check(comment) def comment(): print('发表评论') comment()
property属性
property属性就是把类中的方法当作属性进行使用,简化代码的使用
装饰器方法
class Person(object): def __init__(self): self._age = 0 # 获取属性 @property def age(self): return self._age # 修改属性 @age.setter def age(self, new_age): self._age = new_age person1 = Person() print(person1.age) # 修改属性 person1.age = 100 print(person1.age)
类属性方法
class Person(object): def __init__(self): self._age = 0 # 获取属性 def get_age(self): return self._age # 修改属性 def set_age(self, new_age): if new_age >= 150: print("我是嫩爹,骗嫩爹,你个不孝子!") else: self._age = new_age # 类属性方式的property属性 age = property(get_age, set_age) person = Person() print(person.age) person.age = 150 print(person.age) person.age = 100 print(person.age)