Python装饰器分类

Python

装饰器函数: 是指装饰器本身是函数风格的实现;

函数装饰器: 是指被装饰的目标对象是函数;(目标对象);

装饰器类 : 是指装饰器本身是类风格的实现;

类装饰器 : 是指被装饰的目标对象是类;(目标对象);

装饰器函数

目标对象是函数

(1)、装饰器无参数

A、目标无参数

strOldFunctionName = "";

strNewFunctionName= "";#装饰器无参数:

def decorator(callback): #装饰器函数/外部函数,它接受一个函数对象作为参数(这个函数一般就是目标函数);

#目标无参数:

def wrapper(): #闭包函数,用于传递目标函数的所有参数(没有参数);

strOldFunctionName = callback.__name__;print "装饰前的函数名: %s" %strOldFunctionName;print "enter {}()".format(callback.__name__);

callback();#调用目标函数,执行原有功能;

print "leave {}()".format(callback.__name__);pass;return wrapper; #返回闭包函数对象;

@decorator #装饰器无参数;

def target(): #目标函数:需要增加功能的函数(没有参数);

strNewFunctionName = target.__name__;print "装饰后的函数名: %s" %strNewFunctionName;pass;

target();#用装饰过的新函数;

print "函数名变化: %s --> %s" % (strOldFunctionName, strNewFunctionName)

B、目标有参数

strOldFunctionName = "";

strNewFunctionName= "";#装饰器无参数:

def decorator(callback): #装饰器函数/外部函数,它接受一个函数对象作为参数(这个函数一般就是目标函数);

#目标有参数:

def wrapper(*args, **kwargs): #闭包函数,用于传递目标函数的所有参数(任意参数);

strOldFunctionName = callback.__name__;print "装饰前的函数名: %s" %strOldFunctionName;print "enter {}()".format(callback.__name__);

callback(*args, **kwargs); #调用目标函数,执行原有功能;

print "leave {}()".format(callback.__name__);pass;return wrapper; #返回闭包函数对象;

@decorator #装饰器无参数;

def target0(): #目标函数:需要增加功能的函数(没有参数) ;

strNewFunctionName = target0.__name__;print "装饰后的函数名target0 = %s" %strNewFunctionName;pass;

@decorator#装饰器无参数;

def target1(a): #目标函数:需要增加功能的函数(1个参数) ;

print "a =", a;

strNewFunctionName= target1.__name__;print "装饰后的函数名target1 = %s" %strNewFunctionName;pass;

@decorator#装饰器无参数;

def target2(a, b): #目标函数:需要增加功能的函数(2个参数) ;

print "a =", a, ", b =", b;

strNewFunctionName= target2.__name__;print "装饰后的函数名target2 = %s" %strNewFunctionName;pass;

target0();#调用装饰过的新函数;

target1(6); #调用装饰过的新函数;

target2(2, 8); #调用装饰过的新函数;

(2)、装饰器有参数

A、目标无参数

strOldFunctionName = "";

strNewFunctionName= "";#装饰器有参数:

def decorator(name): #装饰器函数,参数name可以作为关键字使用(可选的特点);

def wrapper(callback): #内嵌一级闭包函数wrapper(),用于传递目标函数对象;接受一个函数对象作为参数(这个函数一般就是目标函数);

#目标无参数:

def _wrapper(): #二级闭包函数_wrapper()用于传递目标函数的所有参数(没有参数);

strOldFunctionName = callback.__name__;print "装饰前的函数名: %s" %strOldFunctionName;print "{name}: enter {func}()".format(name = name, func = callback.__name__); #打印输出:通过关键字模式"{name}"打印,关键字name与format()的name关键字参数相同,func雷同;

callback(); #调用目标函数,执行原有功能(没有参数);

print "{name}: leave {func}!".format(name = name, func = callback.__name__); #打印输出:通过关键字模式"{name}"打印,关键字name与format()的name关键字参数相同,func雷同;

pass;return _wrapper; #在一级闭包函数中返回二级闭包函数对象;

return wrapper; #在装饰器函数中返回一级闭包函数对象;#装饰器有参数:

@decorator(name = "SYSTEM") #装饰目标函数,参数name被用作关键字参数传递(可选参数的特点);

def target(): #目标无参数;

strNewFunctionName = target.__name__;print "装饰后的函数名target = %s" %strNewFunctionName;pass;

target();#调用装饰过的新函数;

B、目标有参数

strOldFunctionName = "";

strNewFunctionName= "";#装饰器有参数:

def decorator(name): #装饰器函数,参数name可以作为关键字使用(可选的特点);

def wrapper(callback): #内嵌一级闭包函数wrapper(),用于传递目标函数对象;接受一个函数对象作为参数(这个函数一般就是目标函数);

#目标有参数:

def _wrapper(*args, **kwargs): #二级闭包函数_wrapper()用于传递目标函数的所有参数;

strOldFunctionName = callback.__name__;print "装饰前的函数名: %s" %strOldFunctionName;print "{name}: enter {func}()".format(name = name, func = callback.__name__); #打印输出:通过关键字模式"{name}"打印,关键字name与format()的name关键字参数相同,func雷同;

callback(*args, **kwargs); #调用目标函数,执行原有功能;

print "{name}: leave {func}!".format(name = name, func = callback.__name__); #打印输出:通过关键字模式"{name}"打印,关键字name与format()的name关键字参数相同,func雷同;

pass;return _wrapper; #在一级闭包函数中返回二级闭包函数对象;

return wrapper; #在装饰器函数中返回一级闭包函数对象;#装饰器有参数:

@decorator(name = 'SYSTEM') #装饰目标函数,参数name被用作关键字参数传递(可选参数的特点);

deftarget3(a, b, c):

strNewFunctionName= target3.__name__;print "装饰后的函数名target = %s" %strNewFunctionName;print "a = %d, b = %d, c = %d" %(a, b, c);pass;#装饰器有参数:

@decorator('PROCESS') #装饰目标函数,参数name没有被用作关键字参数传递;

deftarget2(x, y):

strNewFunctionName= target2.__name__;print "装饰后的函数名target = %s" %strNewFunctionName;print "x = %d, y = %d" %(x, y);pass;

target2(6, 8); #调用装饰过的新函数;

target3(4, 6, 8); #调用装饰过的新函数;

目标对象是类

(1)、装饰器无参数

A、目标无参数

strOldClassName = "";

strNewClassName= "";#装饰器无参数:

def decorator(cls): #装饰器,它没有参数,只是接受类对象作为参数(被装饰的目标类);

#目标无参数:

def wrapper(): #一级闭包函数,它负责传递类的构造函数需要用到的参数(没有参数);

strOldClassName = cls.__name__;print "装饰前的类名: %s" %strOldClassName;print "call {name}.__init__".format(name = cls.__name__);

objCls= cls(); #调用原始类的构造函数(没有参数);

return objCls; #返回新的类对象(被装饰过的目标类对象);

return wrapper; #返回一级闭包函数对象;

@decoratorclasstarget:def __init__(self): #目标无参数;

strNewClassName = target.__name__;print "装饰后的类名: %s" %strNewClassName;pass;defecho(self, msg):print "echo:", msg;pass;

t= target(); #用装饰过的新类创建对象;

t.echo("XXXXXXXXXXXX");

B、目标有参数

strOldClassName = "";

strNewClassName= "";#装饰器无参数:

def decorator(cls): #装饰器,它没有参数,只是接受类对象作为参数(被装饰的目标类);

#目标有参数:

def wrapper(*args, **kwargs): #一级闭包函数,它负责传递类的构造函数需要用到的参数;

strOldClassName = cls.__name__;print "装饰前的类名: %s" %strOldClassName;print "call {name}.__init__".format(name = cls.__name__);

objCls= cls(*args, **kwargs); #调用原始类的构造函数;

return objCls; #返回新的类对象(被装饰过的目标类对象);

return wrapper; #返回一级闭包函数对象;

@decoratorclasstarget1:def __init__(self, arg): #目标有参数;

self.arg =arg;print "arg =", arg;

strNewClassName= target1.__name__;print "装饰后的类名: %s" %strNewClassName;pass;defecho(self, msg):print "echo:", msg;pass;

@decoratorclasstarget2:def __init__(self, arg1, arg2): #目标有参数;

self.arg1 =arg1;

self.arg2=arg2;print "arg1 =", self.arg1, ", arg2 =", self.arg2;

strNewClassName= target2.__name__;print "装饰后的类名: %s" %strNewClassName;pass;defecho(self, msg):print "echo:", msg;pass;

@decoratorclasstarget3:def __init__(self): #目标无参数;

strNewClassName = target3.__name__;print "装饰后的类名: %s" %strNewClassName;pass;defecho(self, msg):print "echo:", msg;pass;

t1= target1(123); #用装饰过的新类创建对象;

t1.echo("1111111111");

t2= target2(456, 789); #用装饰过的新类创建对象;

t1.echo("2222222222");

t3= target3(); #用装饰过的新类创建对象;

t3.echo("3333333333");

(2)、装饰器有参数

A、目标无参数

strOldClassName = "";

strNewClassName= "";#装饰器有参数:

def decorator(level = 'INFO'): #装饰器,它需要参数;

def _wrapper(cls): #一级闭包函数对象,它接受一个类(被装饰的目标类)对象(类也是对象)作为参数;

#目标无参数:

def __wrapper(): #二级闭包函数,它负责传递类的构造函数需要用到的参数(没有参数);

strOldClassName = cls.__name__;print "装饰前的类名: %s" %strOldClassName;print "[{level}] call {name}.__init__".format(level = level, name = cls.__name__);

objCls= cls(); #调用原始类的构造函数(没有参数);

return objCls; #返回新的类对象(被装饰过的目标类对象);

return __wrapper; #返回二级闭包函数对象;

return _wrapper; #返回一级闭包函数对象;

@decorator()classtarget1:def __init__(self): #目标无参数;

strNewClassName = target1.__name__;print "装饰后的类名: %s" %strNewClassName;pass;defecho(self, msg):print "echo:", msg;pass;

@decorator("DEBUG")classtarget2:def __init__(self): #目标无参数;

strNewClassName = target2.__name__;print "装饰后的类名: %s" %strNewClassName;pass;defecho(self, msg):print "echo:", msg;pass;

@decorator(level= "SYSTEM")classtarget3:def __init__(self): #目标无参数;

strNewClassName = target3.__name__;print "装饰后的类名: %s" %strNewClassName;pass;defecho(self, msg):print "echo:", msg;pass;

t1= target1(); #用装饰过的新类创建对象;

t1.echo("AAAAAAAA");

t2= target2(); #用装饰过的新类创建对象;

t2.echo("BBBBBBBB");

t3= target3(); #用装饰过的新类创建对象;

t3.echo("CCCCCCCC");

B、目标有参数

strOldClassName = "";

strNewClassName= "";#装饰器有参数:

def decorator(level = 'INFO'): #装饰器,它需要参数;

def _wrapper(cls): #一级闭包函数对象,它接受一个类(被装饰的目标类)对象(类也是对象)作为参数;

#目标有参数:

def __wrapper(*args, **kwargs): #二级闭包函数,它负责传递类的构造函数需要用到的参数;

strOldClassName = cls.__name__;print "装饰前的类名: %s" %strOldClassName;print "[{level}] call {name}.__init__".format(level = level, name = cls.__name__);

objCls= cls(*args, **kwargs); #调用原始类的构造函数;

return objCls; #返回新的类对象(被装饰过的目标类对象);

return __wrapper; #返回二级闭包函数对象;

return _wrapper; #返回一级闭包函数对象;

@decorator()classtarget1:def __init__(self, arg):

self.arg=arg;print "arg =", arg;

strNewClassName= target1.__name__;print "装饰后的类名: %s" %strNewClassName;pass;defecho(self, msg):print "echo:", msg;pass;

@decorator('ERROR')classtarget2:def __init__(self, arg1, arg2):

self.arg1=arg1;

self.arg2=arg2;print "arg1 =", self.arg1, ", arg2 =", self.arg2;

strNewClassName= target2.__name__;print "装饰后的类名: %s" %strNewClassName;pass;defecho(self, msg):print "echo:", msg;pass;

@decorator(level= 'WARN')classtarget3:def __init__(self):

strNewClassName= target3.__name__;print "装饰后的类名: %s" %strNewClassName;pass;defecho(self, msg):print "echo:", msg;pass;

t1= target1(123); #用装饰过的新类创建对象;

t1.echo("1111111111");

t2= target2(456, 789); #用装饰过的新类创建对象;

t1.echo("2222222222");

t3= target3(); #用装饰过的新类创建对象;

t3.echo("3333333333");

装饰器类

装饰器本身是一个类,通过构造函数__init__()和回调函数__call__()实现装饰器功能

目标对象是函数

(1)、装饰器无参数

A、目标无参数

#装饰器无参数:

class decorator: #装饰器类,它也可以从object继承"class decorator(object)";

def __init__(self, callback): #在构造函数里面接受callback对象(原始目标函数对象)作为参数;

self.callback =callback;

self.__name__ = callback.__name__; #保证被装饰之后函数名字不变;

pass;#目标无参数:

def __call__(self): #在__call__()函数中传递目标函数对象的所有参数(没有参数);

print "装饰前的函数名: %s" % self.callback.__name__;print "enter {func}()".format(func = self.callback.__name__);

result=self.callback();print "leave {func}()".format(func = self.callback.__name__);returnresult;

@decoratordeftarget():print "装饰后的函数名: %s" % target.__name__;pass;

target();#调用装饰过的新函数;

B、目标有参数

#装饰器无参数:

class decorator: #装饰器类,它也可以从object继承"class decorator(object)";

def __init__(self, callback): #在构造函数里面接受callback对象(原始目标函数对象)作为参数;

self.callback =callback;

self.__name__ = callback.__name__; #保证被装饰之后函数名字不变;

pass;#目标有参数:

def __call__(self, *args, **kwargs): #在__call__()函数中传递目标函数对象的所有参数(任意参数);

print "装饰前的函数名: %s" % self.callback.__name__;print "enter {func}()".format(func = self.callback.__name__);

result= self.callback(*args, **kwargs); #传递任意参数;

print "leave {func}()".format(func = self.callback.__name__);returnresult;

@decoratordeftarget0():print "装饰后的函数名: %s" % target0.__name__;pass;

@decoratordeftarget1(a, b):print "a = %d, b = %d" %(a, b);print "装饰后的函数名: %s" % target1.__name__;pass;

target0();#调用装饰过的新函数;

target1(6, 8); #调用装饰过的新函数;

(2)、装饰器有参数

A、目标无参数

#装饰器有参数:

classdecorator:def __init__(self, name = 'INFO'): #在装饰器的构造函数中传递装饰器类需要的参数;

self.name =name;pass;#目标无参数:

def __call__(self, callback): #在__call__()函数中接受callback对象(原始目标函数对象)作为参数;

def wrapper(): #内部闭包函数,给目标函数增加额外的功能(没有参数);

print "装饰后的函数名: %s" % callback.__name__;print "[{name}] enter {func}()".format(name = self.name, func = callback.__name__);

result= callback(); #调用原始目标函数,没有参数;

print "[{name}] leave {func}()".format(name = self.name, func = callback.__name__);returnresult;return wrapper; #返回新的目标函数对象;

@decorator()deftarget0():print "装饰后的函数名: %s" % target0.__name__;pass;

@decorator('ERROR')deftarget1():print "装饰后的函数名: %s" % target1.__name__;pass;

@decorator(name= 'SYSTEM')deftarget2():print "装饰后的函数名: %s" % target2.__name__;pass;

target0();#调用装饰过的新函数;

target1(); #调用装饰过的新函数;

target2(); #调用装饰过的新函数;

B、目标有参数

#装饰器有参数:

classdecorator:def __init__(self, name = 'INFO'): #在装饰器的构造函数中传递装饰器类需要的参数;

self.name =name;pass;#目标有参数:

def __call__(self, callback): #在__call__()函数中接受callback对象(原始目标函数对象)作为参数;

def wrapper(*args, **kwargs): #内部闭包函数,给目标函数增加额外的功能(任意参数);

print "装饰后的函数名: %s" % callback.__name__;print "[{name}] enter {func}()".format(name = self.name, func = callback.__name__);

result= callback(*args, **kwargs); #调用原始目标函数,传递任意参数;

print "[{name}] leave {func}()".format(name = self.name, func = callback.__name__);returnresult;return wrapper; #返回新的目标函数对象;

@decorator()deftarget0():print "装饰后的函数名: %s" % target0.__name__;pass;

@decorator('ERROR')deftarget1(a):print "装饰后的函数名: %s" % target1.__name__;print "a = %d" %(a);pass;

@decorator(name= 'SYSTEM')deftarget2(x, y):print "装饰后的函数名: %s" % target2.__name__;print "x = %d, y = %d" %(x, y);pass;

target0();#调用装饰过的新函数;

target1(2); #调用装饰过的新函数;

target2(6, 8); #调用装饰过的新函数;

目标对象是类

(1)、装饰器无参数

A、目标无参数

#装饰器无参数:

classdecorator:def __init__(self, cls): #在装饰器的构造函数中传递被装饰类的对象;

self.cls =cls;

self.__name__ = cls.__name__; #保证被装饰之后类的名字不变;

pass;#目标无参数:

def __call__(self): #在__call__()函数中接受callback对象(原始目标函数对象)的所有参数(没有参数);

print "装饰前的类名: %s" % self.cls.__name__;print "enter {func}()".format(func = self.cls.__name__);

objCls= self.cls(); #调用原始类的构造函数,传递任意参数(没有参数);

print "leave {func}()".format(func = self.cls.__name__);return objCls; #返回新的目标类对象;

@decorator #装饰器无参数;

classtarget:def __init__(self): #目标无参数;

print "装饰后的类名: %s" % target.__name__;pass;defecho(self, msg):print "echo:", msg;pass;

t= target(); #用装饰过的新类创建对象;

B、目标有参数

#装饰器无参数:

classdecorator:def __init__(self, cls): #在装饰器的构造函数中传递被装饰类的对象;

self.cls =cls;

self.__name__ = cls.__name__; #保证被装饰之后类的名字不变;

pass;#目标有参数:

def __call__(self, *args, **kwargs): #在__call__()函数中接受callback对象(原始目标函数对象)的所有参数(任意参数);

print "装饰前的类名: %s" % self.cls.__name__;print "enter {func}()".format(func = self.cls.__name__);

objCls= self.cls(*args, **kwargs); #调用原始类的构造函数,传递任意参数;

print "leave {func}()".format(func = self.cls.__name__);return objCls; #返回新的目标类对象;

@decorator #装饰器无参数;

classtarget0:def __init__(self): #目标无参数;

print "装饰后的类名: %s" % target0.__name__;pass;defecho(self, msg):print "echo:", msg;pass;

@decorator#装饰器无参数;

classtarget1:def __init__(self, arg1, arg2): #目标有参数;

self.arg1 =arg1;

self.arg2=arg2;print "arg1 =", self.arg1, ", arg2 =", self.arg2;print "装饰后的类名: %s" % target1.__name__;pass;defecho(self, msg):print "echo:", msg;pass;

@decorator#装饰器无参数;

classtarget2:def __init__(self, arg1): #目标有参数;

self.arg1 =arg1;print "arg1 =", self.arg1;print "装饰后的类名: %s" % target2.__name__;pass;defecho(self, msg):print "echo:", msg;pass;

t1= target0(); #用装饰过的新类创建对象;

t1.echo("AAAAAAAA");

t2= target1(6, 8); #用装饰过的新类创建对象;

t2.echo("BBBBBBBB");

t3= target2(9); #用装饰过的新类创建对象;

t3.echo("CCCCCCCC");

(2)、装饰器有参数

A、目标无参数

#装饰器有参数:

classdecorator:def __init__(self, name = 'INFO'): #在装饰器的构造函数中传递装饰器类需要的参数;

self.name =name;pass;#目标无参数:

def __call__(self, cls): #在__call__()函数中接受callback对象(原始目标函数对象)作为参数;

def wrapper(): #内部闭包函数,给目标类增加额外的功能(没有参数);

print "装饰前的类名: %s" % cls.__name__;print "[{name}] enter {func}()".format(name = self.name, func = cls.__name__);

objCls= cls(); #调用原始类的构造函数(没有参数);

print "[{name}] leave {func}()".format(name = self.name, func = cls.__name__);returnobjCls;return wrapper; #返回新的目标函数对象;

@decorator() #装饰器有参数;

classtarget0:def __init__(self): #目标无参数;

print "装饰后的类名: %s" % target0.__name__;pass;defecho(self, msg):print "echo:", msg;pass;

@decorator("DEBUG") #装饰器有参数;

classtarget1:def __init__(self): #目标无参数;

print "装饰后的类名: %s" % target1.__name__;pass;defecho(self, msg):print "echo:", msg;pass;

@decorator(name= "SYSTEM") #装饰器有参数;

classtarget2:def __init__(self): #目标无参数;

print "装饰后的类名: %s" % target2.__name__;pass;defecho(self, msg):print "echo:", msg;pass;

t1= target0(); #用装饰过的新类创建对象;

t1.echo("AAAAAAAA");

t2= target1(); #用装饰过的新类创建对象;

t2.echo("BBBBBBBB");

t3= target2(); #用装饰过的新类创建对象;

t3.echo("CCCCCCCC");

B、目标有参数

#装饰器有参数:

classdecorator:def __init__(self, name = 'INFO'): #在装饰器的构造函数中传递装饰器类需要的参数;

self.name =name;pass;#目标有参数:

def __call__(self, cls): #在__call__()函数中接受callback对象(原始目标函数对象)作为参数;

def wrapper(*args, **kwargs): #内部闭包函数,给目标类增加额外的功能(任意参数);

print "装饰前的类名: %s" % cls.__name__;print "[{name}] enter {func}()".format(name = self.name, func = cls.__name__);

objCls= cls(*args, **kwargs); #调用原始类的构造函数,传递任意参数;

print "[{name}] leave {func}()".format(name = self.name, func = cls.__name__);returnobjCls;return wrapper; #返回新的目标函数对象;

@decorator() #装饰器有参数;

classtarget0:def __init__(self): #目标无参数;

print "装饰后的类名: %s" % target0.__name__;pass;defecho(self, msg):print "echo:", msg;pass;

@decorator("DEBUG") #装饰器有参数;

classtarget1:def __init__(self, arg1, arg2): #目标有参数;

self.arg1 =arg1;

self.arg2=arg2;print "arg1 =", self.arg1, ", arg2 =", self.arg2;print "装饰后的类名: %s" % target1.__name__;pass;defecho(self, msg):print "echo:", msg;pass;

@decorator(name= "SYSTEM") #装饰器有参数;

classtarget2:def __init__(self, arg1): #目标有参数;

self.arg1 =arg1;print "arg1 =", self.arg1;print "装饰后的类名: %s" % target2.__name__;pass;defecho(self, msg):print "echo:", msg;pass;

t1= target0(); #用装饰过的新类创建对象;

t1.echo("AAAAAAAA");

t2= target1(6, 8); #用装饰过的新类创建对象;

t2.echo("BBBBBBBB");

t3= target2(9); #用装饰过的新类创建对象;

t3.echo("CCCCCCCC");

【备注】

针对装饰器类用于装饰函数的情况,装饰器类还有如下写法:把内嵌的闭包函数定义成装饰器类的成员函数;

例如:

#装饰器有参数:

classdecorator:def __init__(self, name = 'INFO'): #在装饰器的构造函数中传递装饰器类需要的参数;

self.name =name;pass;#目标有参数:

def __call__(self, callback): #在__call__()函数中接受callback对象(原始目标函数对象)作为参数;

self.callback =callback;return self.wrapper; #返回新的目标函数对象(闭包函数对象);

#原来的闭包函数被定义为成员函数:

def wrapper(*args, **kwargs): #内部闭包函数,给目标函数增加额外的功能(任意参数);

print "装饰后的函数名: %s" % callback.__name__;print "[{name}] enter {func}()".format(name = self.name, func = callback.__name__);

result= self.callback(*args, **kwargs); #调用原始目标函数,传递任意参数;

print "[{name}] leave {func}()".format(name = self.name, func = callback.__name__);return result;

【总结】

[1] @decorator后面不带括号时(也即装饰器无参数时),效果就相当于先定义func或cls,而后执行赋值操作func=decorator(func)或cls=decorator(cls);

[2] @decorator后面带括号时(也即装饰器有参数时),效果就相当于先定义func或cls,而后执行赋值操作 func=decorator(decoratorArgs)(func)或cls=decorator(decoratorArgs)(cls);

[3] 如上将func或cls重新赋值后,此时的func或cls也不再是原来定义时的func或cls,而是一个可执行体,你只需要传入参数就可调用,func(args)=>返回值或者输出,cls(args)=>object of cls;

[4] 最后通过赋值返回的执行体是多样的,可以是闭包,也可以是外部函数;当被装饰的是一个类时,还可以是类内部方法,函数;

[5] 另外要想真正了解装饰器,一定要了解func.func_code.co_varnames,func.func_defaults,通过它们你可以以func的定义之外,还原func的参数列表;另外关键字参数是因为调用而出现的,而不是因为func的定义,func的定义中的用等号连接的只是有默认值的参数,它们并不一定会成为关键字参数,因为你仍然可以按照位置来传递它们;

【转载】

python 装饰器分类_Python 装饰器(Decorators) 超详细分类实例相关推荐

  1. python入门教程收藏_python入门教程:超详细保你1小时学会Python,快来收藏看看...

    简介:简介(转发文章+私信[Python]获取资料方式)1.Hello world安装完Python之后,打开IDLE(Python GUI) ,该程序是Python语言解释器,你写的语句能够立即运行 ...

  2. python入门教程收藏_python入门教程:超详细保你2小时学会Python,快来收藏看看...

    简介:(转发文章+私信[Python]获取资料方式)1.Hello world安装完Python之后,打开IDLE(Python GUI) ,该程序是Python语言解释器,你写的语句能够立即运行.我 ...

  3. python 微信红包群_Python自动抢红包,超详细教程,再也不会错过微信红包了!...

    目录: 0 引言 1 环境 2 需求分析 3 前置准备 4 抢红包流程回顾 5 代码梳理 6 后记 0 引言 提到抢红包,就不得不提Xposed框架,它简直是个抢红包的神器,但使用Xposed框架有一 ...

  4. python微信抢红包神器_Python自动抢红包,超详细教程,再也不会错过微信红包了...

    0 引言 提到抢红包,就不得不提Xposed框架,它简直是个抢红包的神器,但使用Xposed框架有一个前提条件:手机需要root,对于苹果手机的话就需要越狱了.现在的手机想要root或越狱并不容易,同 ...

  5. anaconda必须安装在c盘吗_Window版本 - Python数据分析集成开发环境 Anaconda安装(超详细)...

    Window版本 - Python数据分析集成开发环境 Anaconda安装(超详细) 前沿 ​ Hello,各位看官,您是不是决定要学习Python数据分析,您是不是现在正在"学" ...

  6. python通过调用百度api实现语音识别(超详细)

    python通过调用百度api实现语音识别(超详细) 2021.04.18:该文章是在18年,初学Python时写的,所以功能仅限于当时可用,至于现在(貌似依然可用)和以后就不确定了.完整的demo也 ...

  7. 【Python爬虫实例学习篇】——5、【超详细记录】从爬取微博评论数据(免登陆)到生成词云

    [Python爬虫实例学习篇]--5.[超详细记录]从爬取微博评论数据(免登陆)到生成词云 个人博客地址:ht/tps://www.asyu17.cn/ 精彩部分提醒: (1)微博评论页详情链接为一个 ...

  8. python 装饰器实现_Python装饰器系列01 - 如何正确地实现装饰器

    虽然人们能利用函数闭包(function clouser)写出简单的装饰器,但其可用范围常受限制.多数实现装饰器的基本方式会破坏与内省(Introspection)的关联性. 可大多数人会说:who ...

  9. python 开闭原则_Python 装饰器@,对函数进行功能扩展操作示例【开闭原则】

    本文实例讲述了Python 装饰器@,对函数进行功能扩展操作.分享给大家供大家参考,具体如下: 装饰器可以对原函数进行功能扩展,但还不需要修改原函数的内容(开闭原则),也不需要修改原函数的调用. de ...

最新文章

  1. 【Ubuntu】Ubuntu下的录频软件SimpleScreenRecorder
  2. es中的Plugin机制
  3. python怎么输出文字_python怎么输出汉字
  4. chart绑定mysql数据源_MSChart图表之Chart组件 学习一篇(5个主要属性+数据源绑定)...
  5. P3507-[POI2010]GRA-The Minima Game【dp,博弈论】
  6. [转]Eclipse Java注释模板设置详解
  7. ArcGIS利用数据驱动工具条批量出图(python代码)
  8. 三分钟让面试官满意系列 - Bagging和Boosting 的联系及区别
  9. 程序架构探讨—005 应用服务器集群的伸缩性之反向代理负载均衡
  10. 方法级别的java日志输出控制(一)
  11. 概率论 - 常见分布(及其分布表)
  12. [软件应用]深入验证Nero是否注册成功
  13. flashfxp连接centos7失败原因之一
  14. 单片机最小系统着实让人着迷
  15. PID控制器的离散化推导及其C语言实现
  16. python生成文件夹以及压缩文件夹
  17. 程序员的语言“艳遇史”(四) ——数学系师姐forth
  18. excel中以文本形式保存长数字
  19. Hazelcast IMDG学习 Map java demo
  20. Sign in With Apple (苹果授权登录)

热门文章

  1. 如何通过SQL按内容拆分字段(将一个字段值拆分两个字段)
  2. java cmd 返回结果_Java调用cmd命令行并返回执行结果
  3. smooth_L1_loss_layer.cpp:28] Check failed: bottom[0]-channels() == bottom[1]-channels() (12 vs. 84
  4. python中复制、浅层拷贝、深层拷贝的区别
  5. Oracle数据库学习(一)安装和简单使用
  6. python小数据池,代码块的最详细、深入剖析
  7. 业务分析之--权限管理
  8. 转:Ogre的MaterialSystem分析
  9. PowerShell自动删除过期数据
  10. 网络分层协议图以及各层的简介