当前位置 博文首页 > m0_51723227的博客:装饰器
装饰器的本质是闭包
作用是不需要改变 原代码 便可以给它增加另外的功能
比如一个函数是这样的:
def f1():
print("=====正在登陆无异常=====")
我们想在 **print()**的上面和下面分别添加
=====正在验证...=====
=====验证成功...=====
并且不能修改函数f1的代码,我们可以利用闭包:
def f1():
print("=====正在登陆无异常=====")
def func(function):
def func1():
print("=====正在验证...=====")
function()
print("=====验证成功...=====")
return func1
func(f1)()
'''
有人可能不理解func(f1)()是怎么回事
其实可以这样理解
a = func(f1)
a()
'''
结果:
=====正在验证...=====
=====正在登陆无异常=====
=====验证成功...=====
现在我们使用装饰器,即 @闭包
def func(function):
def func1():
print("=====正在验证...=====")
function()
print("=====验证成功...=====")
return func1
@func
def f1():
print("=====正在登陆无异常=====")
f1() #调用 f1() 其实就是相当于 调用func(),而把 f1 当成func()的形参穿进去了
结果:
=====正在验证...=====
=====正在登陆无异常=====
=====验证成功...=====
以上的装饰器为自定义装饰器
在python里面还有一些内置装饰器
让方法变成类方法
让方法变成静态方法
可以实现访问实例方法时使用实例.属性形式
class Func:
instance = 0
def __init__(self, name):
self.name = name
Func.instance += 1
#类方法
@classmethod
def func1(cls):
return cls.instance
#静态方法
@staticmethod
def func2():
return "今天是个好日子"
#属性形式访问
@property
def func3(self):
return "大家好,我叫 %s" % self.name
xiao_ming = Func("小明")
xiao_hong = Func("小红")
xiao_hei = Func("小黑")
a = Func("sss")
print(Func.func1())
print(a.func2())
print(xiao_hei.func3) #仔细看访问形式
以及类装饰器
class Myclass:
def __init__ (self,func):
self.func = func
def __call__ (self, *args, **kwargs):
print("--------------正在验证---------------")
return self.func()
# 这里有个注意点,就是类装饰里面必须有 __call__方法!!!!!!!!!!!!!!
@Myclass
def f1():
print("------------正在登陆------------")
f1()
'''
这里解释一下类装饰器的运行原理
第一步,当 @某一个类时,便自动实例化一个对象了,并且把f1传入--init--中,即func是f1放入形参
举个例子
就是在@类的时候,就已经发生了 a = Myclass( f1 )
但是并没有写出这一步,便直接把 f1 这个函数体给穿进去了
'''
结果:
--------------正在验证---------------
------------正在登陆------------
cs