上一篇:由浅入深,走进Python装饰器-----第三篇:进阶--类装饰函数


函数装饰器

@函数类



本篇只是用一个简单的例子,验证函数可以对类进行修饰, 但是由于返回的值为函数,并不是类, 把原有类的实例化调用方式变为了函数调用.#### 要点:读者还应注意返回值为类或者对象时候的相应参数使用区别



3.1 用函数装饰器来扩展原类

def KuoZhan(cls): def new_func(): print("类里新增的方法new_func") def new_class(): cls.say = "类里新增的属性" cls.new_func = new_func # 此处返回类,注意和3.2返回的对象例子做参数对比, return cls return new_class# 通过函数装饰器给类增加属性或者方法 @KuoZhan #1. @KuoZhan ==> KuoZhan( ) class MyClass(): def func(): print("我是原类里的方法func")# 此处改变了原类的调用方式, 实际上MyClass已经是一个函数名了# type(MyClass) = <class 'function'>obj = MyClass()# obj 拿到的是函数new_class的返回值clsobj.func()obj.new_func()print(obj.say)>>>我是原类里的方法func>>>类里新增的方法new_func>>>类里新增的属性3.2 用函数装饰器来扩展原类

def KuoZhan(cls): # 增加参数self def new_func(self): print("类里新增的方法new_func") def new_class(): cls.say = "类里新增的属性" cls.new_func = new_func # 此处返回对象 return cls() return new_class# 通过函数装饰器给类增加属性或者方法 @KuoZhan #1. @KuoZhan ==> KuoZhan( ) class MyClass(): # 增加参数self def func(self): print("我是原类里的方法func")# 此处改变了原类的调用方式, 实际上MyClass已经是一个函数名了# type(MyClass) = <class 'function'>obj = MyClass()# obj 拿到的是函数new_class的返回值clsobj.func()obj.new_func()print(obj.say)>>>我是原类里的方法func>>>类里新增的方法new_func>>>类里新增的属性3.3 用带参数的函数装饰器来扩展原类

def outer(n): def KuoZhan1(cls): def new_func(): print("类里新增的方法new_func") def new_class(): cls.say = "类里新增的属性" cls.new_func = new_func # 此处返回类,注意和3.2返回的对象例子做参数对比, return cls return new_class def KuoZhan2(cls): pass if n == 1: return KuoZhan1 else: return KuoZhan2# 通过函数装饰器给类增加属性或者方法 @outer(1) #1. outer(1) ==> KuoZhan1 2.@out(1) == @KuoZhan1 class MyClass(): def func(): print("我是原类里的方法func")# 此处改变了原类的调用方式, 实际上MyClass已经是一个函数名了# type(MyClass) = <class 'function'>obj = MyClass()# obj 拿到的是函数new_class的返回值clsobj.func()obj.new_func()print(obj.say)>>>我是原类里的方法func>>>类里新增的方法new_func>>>类里新增的属性