python 装饰器分类_Python 装饰器(Decorators) 超详细分类实例
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) 超详细分类实例相关推荐
- python入门教程收藏_python入门教程:超详细保你1小时学会Python,快来收藏看看...
简介:简介(转发文章+私信[Python]获取资料方式)1.Hello world安装完Python之后,打开IDLE(Python GUI) ,该程序是Python语言解释器,你写的语句能够立即运行 ...
- python入门教程收藏_python入门教程:超详细保你2小时学会Python,快来收藏看看...
简介:(转发文章+私信[Python]获取资料方式)1.Hello world安装完Python之后,打开IDLE(Python GUI) ,该程序是Python语言解释器,你写的语句能够立即运行.我 ...
- python 微信红包群_Python自动抢红包,超详细教程,再也不会错过微信红包了!...
目录: 0 引言 1 环境 2 需求分析 3 前置准备 4 抢红包流程回顾 5 代码梳理 6 后记 0 引言 提到抢红包,就不得不提Xposed框架,它简直是个抢红包的神器,但使用Xposed框架有一 ...
- python微信抢红包神器_Python自动抢红包,超详细教程,再也不会错过微信红包了...
0 引言 提到抢红包,就不得不提Xposed框架,它简直是个抢红包的神器,但使用Xposed框架有一个前提条件:手机需要root,对于苹果手机的话就需要越狱了.现在的手机想要root或越狱并不容易,同 ...
- anaconda必须安装在c盘吗_Window版本 - Python数据分析集成开发环境 Anaconda安装(超详细)...
Window版本 - Python数据分析集成开发环境 Anaconda安装(超详细) 前沿 Hello,各位看官,您是不是决定要学习Python数据分析,您是不是现在正在"学" ...
- python通过调用百度api实现语音识别(超详细)
python通过调用百度api实现语音识别(超详细) 2021.04.18:该文章是在18年,初学Python时写的,所以功能仅限于当时可用,至于现在(貌似依然可用)和以后就不确定了.完整的demo也 ...
- 【Python爬虫实例学习篇】——5、【超详细记录】从爬取微博评论数据(免登陆)到生成词云
[Python爬虫实例学习篇]--5.[超详细记录]从爬取微博评论数据(免登陆)到生成词云 个人博客地址:ht/tps://www.asyu17.cn/ 精彩部分提醒: (1)微博评论页详情链接为一个 ...
- python 装饰器实现_Python装饰器系列01 - 如何正确地实现装饰器
虽然人们能利用函数闭包(function clouser)写出简单的装饰器,但其可用范围常受限制.多数实现装饰器的基本方式会破坏与内省(Introspection)的关联性. 可大多数人会说:who ...
- python 开闭原则_Python 装饰器@,对函数进行功能扩展操作示例【开闭原则】
本文实例讲述了Python 装饰器@,对函数进行功能扩展操作.分享给大家供大家参考,具体如下: 装饰器可以对原函数进行功能扩展,但还不需要修改原函数的内容(开闭原则),也不需要修改原函数的调用. de ...
最新文章
- 【Ubuntu】Ubuntu下的录频软件SimpleScreenRecorder
- es中的Plugin机制
- python怎么输出文字_python怎么输出汉字
- chart绑定mysql数据源_MSChart图表之Chart组件 学习一篇(5个主要属性+数据源绑定)...
- P3507-[POI2010]GRA-The Minima Game【dp,博弈论】
- [转]Eclipse Java注释模板设置详解
- ArcGIS利用数据驱动工具条批量出图(python代码)
- 三分钟让面试官满意系列 - Bagging和Boosting 的联系及区别
- 程序架构探讨—005 应用服务器集群的伸缩性之反向代理负载均衡
- 方法级别的java日志输出控制(一)
- 概率论 - 常见分布(及其分布表)
- [软件应用]深入验证Nero是否注册成功
- flashfxp连接centos7失败原因之一
- 单片机最小系统着实让人着迷
- PID控制器的离散化推导及其C语言实现
- python生成文件夹以及压缩文件夹
- 程序员的语言“艳遇史”(四) ——数学系师姐forth
- excel中以文本形式保存长数字
- Hazelcast IMDG学习 Map java demo
- Sign in With Apple (苹果授权登录)
热门文章
- 如何通过SQL按内容拆分字段(将一个字段值拆分两个字段)
- java cmd 返回结果_Java调用cmd命令行并返回执行结果
- smooth_L1_loss_layer.cpp:28] Check failed: bottom[0]-channels() == bottom[1]-channels() (12 vs. 84
- python中复制、浅层拷贝、深层拷贝的区别
- Oracle数据库学习(一)安装和简单使用
- python小数据池,代码块的最详细、深入剖析
- 业务分析之--权限管理
- 转:Ogre的MaterialSystem分析
- PowerShell自动删除过期数据
- 网络分层协议图以及各层的简介