类共享的那块代码缩进有问题
然后总结一下装饰器的关键:
首先是方法共享,即把一个方法作为其他方法的附加功能
装饰器的使用与平时的方法调用不同,它需要以@+方法名 同时放在被'装饰'的方法的前面 这种形式
这样一来当被'装饰'的方法运行时,装饰方法也会运行
总的来说,要使用方法装饰器,需要形如:#coding=utf-8
def fun_c(fun):
'''
#装饰器的名字随意,这里是fun_c,它需要有一个参数,用于指待调用这个装饰器的方法
:param fun:
:return:
'''
def call():#这个方法名字也可以随意,当约定俗成为call,这个方法包含了装饰器方法的主体代码,同时参数方法混在里面
print 'A'
fun()#参数方法被夹在这里,我们都知道python代码是一行一行执行的,所以会先打印A,然后执行参数方法的代码,最后打印B
print 'B'
return call#必须把call方法返回,不然会提示None类型对象无法被调用,我想当被调用时,实际是这样执行的,fun_c(fun)(),所以当不是一个方法作为放回之的时候,就会产生
@fun_c#装饰器要用的话就放在被装饰方法的前面
def fun_a():
print 'C'
fun_a()#有了装饰器的方法被执行的时候实际上执行的是fun_c(fun_c)()
然后是类共享器:#coding=utf-8
class A:
'''
类共享器的特性在旧式类也可以使用,现在使用的就是旧式类,装饰类需要在构造函数时将产生方法传入,同时被调用的方法必须名为
__call__
'''
def __init__(self,fun):#这里传入了参数方法fun
self.f=fun
def __call__(self):#这个函数的名字不能随便起,不信你试试
print 'A'
self.f()#然后参数方法就可以在这里被调用并执行
print 'B'
@A
def fun_a():
print 'C'
fun_a()
装饰器的作用是,当你需要经常讲函数代码的执行'夹在'一些相同代码的时候,这些相同代码你就可以提取出来做成装饰器,这样你就不用重复写一样的代码,而且很方便~ |