类属性装饰器和普通函数装饰器的概念混淆操作

普通函数装饰器

  • 装饰器本身就是一个高价函数,要不参数为函数,要不返回值为函数
  • 装饰器是在不入侵函数的基础之上,增强装饰函数的功能
  • 在带参装饰器有时会用到闭包和柯里化的操作

普通函数装饰器案例

  • #sumnum == wapper(sumnum) == _wapper
  • #summum(x,y) == _wapper(x,y)
  • #def summum(x,y) == def _wapper(x,y)
def wapper(fn):
    def _wapper(*args):
        print("This is good function")
        func = fn(*args)
        return func
    return _wapper

@wapper
def sumnum(x,y): #sumnum == wapper(sumnum) == _wapper
                 #summum(x,y) == _wapper(x,y)
    return x+y

print(sumnum(3,5))

类属性装饰器概念混淆误操作

  • # Person == wappeer(Person)===等价返回值_wapper,
  • #因此此时相当于class _wapper:因为Person没有紧跟(),因此无法调用此函数
  • #只有调用此函数后,才能返回cls,所以到此时,Person就是_wapper函数
#-*- coding: UTF-8 -*-
def wapper(cls):
    def _wapper():
        """dsds"""
        cls.name = "tom"
        return cls
    return _wapper

@wapper
class Person: # Person == wappeer(Person)===等价返回值_wapper,
    #因此此时相当于class _wapper:因为Person没有紧跟(),因此无法调用此函数
    #只有调用此函数后,才能返回cls,所以到此时,Person就是_wapper函数
    AGE = 8

print(Person.__dict__)
print(type(Person))
运行结果:
{}
<class 'function'>

正确写法

  • 装饰器函数不嵌套和嵌套都可以,如果带参则进行柯里化
  • 装饰器返回值任然是类
#-*- coding: UTF-8 -*-
def wapper(cls):
    cls.name = "tom"
    return cls
@wapper
class Person:
    AGE = 8
print(Person.__dict__)
print(type(Person))
运行结果:
{'__module__': '__main__', 'AGE': 8, 'name': 'tom', '__doc__': None, '__dict__': <attribute '__dict__' of 'Person' objects>,
 '__weakref__': <attribute '__weakref__' of 'Person' objects>}
<class 'type'>

带参装饰器分析

  • 带参装饰器本身返回函数wapper(name) 本身等于 _wapper
  • 相当于@_wapper
  • 因此相当于将Person这个类作为_wapper(Person)的参数
#-*- coding: UTF-8 -*-

def wapper(name):

    def _wapper(cls):
        cls.name = name
        return cls

    return _wapper

@wapper("tom") #等价于@_wapper 
class Person: #Person == _wapper(person) 最终返回cls
    AGE = 8

print(Person.__dict__)
print(type(Person))
运行结果:
{'__module__': '__main__', '__doc__': None, '__weakref__': <attribute '__weakref__' of 'Person' objects>, 
'name': 'tom', 'AGE': 8, '__dict__': <attribute '__dict__' of 'Person' objects>}
<class 'type'>
展开阅读全文

没有更多推荐了,返回首页