Python基础28-面向对象(系统内置方法8-装饰器)
2018-05-24 本文已影响63人
Jacob_LJ

8 装饰器
1 装饰器(函数式实现)
2 通过类方式,实现装饰器
- 通常装饰器使用
def check(func):
print("增加功能")
def inner():
print("登录验证操作....")
func()
return inner
@check
def fss():
print("发说说")
fss()
>>>> 打印结果
增加功能
登录验证操作....
发说说
- 使用@check 方式实际上就是使用
fss = check(fss)
def check(func):
print("增加功能")
def inner():
print("登录验证操作....")
func()
return inner
# @check
def fss():
print("发说说")
fss = check(fss) # 使用@check 方式实际上就是使用`fss = check(fss)`
fss()
>>>> 打印结果
增加功能
登录验证操作....
发说说
- 那么对于
fss = check(fss)
,使用对象思想的理解就是:- check 是一个类,check()方式是实例化 check 类;
- check类实例化时接收一个参数,参数就是是 fss 函数;
- fss 就是 check类的实例对象;
- fss() 就是调用实例方法,此时的 check 类必须实现了
__call__
方法;
实现代码如下
class check:
def __init__(self, func):
self.func = func
def __call__(self, *args, **kwargs):
print("增加功能")
print("登录验证操作....")
self.func()
def fss():
print("发说说")
fss = check(fss)
fss()
>>>> 打印结果
增加功能
登录验证操作....
发说说
- 通过@check 方式,通过类,实现装饰器
class check:
def __init__(self, func):
self.func = func
def __call__(self, *args, **kwargs):
print("增加功能")
print("登录验证操作....")
self.func()
@check
def fss():
print("发说说")
fss()
>>>> 打印结果
增加功能
登录验证操作....
发说说
问题:
- 回顾装饰器的概念及通过闭包及返回函数方式的实现
- 代码练习:通过类形式实现装饰器