python笔记 类装饰器

82 阅读1分钟

携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第25天,点击查看活动详情

0 环境

  • 编辑器:pycharm或者vscode
  • 系统版本:windows10
  • python版本:3.9.6

1 类装饰器

以前我就有疑问,类有么有装饰器呢,但是很少在网上看到这样的文章,哪怕python的书籍也很少提到,直到我看到大佬的文章才了解了,原来可以这么个演变,其实和装饰器类似,而且正常我们也用不到,但是就是想去了解一下,对比一下,看看猪跑。

如下代码:set_age函数接收类和年龄,为该类设置全局变量,并且返回该类。现在回到main中,我们先调用了set_age函数,并且用Demo1变量接收了set_age的返回值(Demo类),通过Demo1()得到demo实例,类.AGE和实例.AGE最终的结果是一致的,如下图结果。

def set_age(cls, age):
    cls.AGE = age
    return cls

class Demo:
    pass

if __name__ == '__main__':
    Demo1 = set_age(Demo, 19)
    demo = Demo1()
    print(Demo1.AGE)
    print(demo.AGE)

image.png

如下代码:我们继续改造,改成这种的,变量 = 函数(add)(1,2) --> 还有一种编写装饰器的方式@xxx,下面我才用@的方式编写。

外层age,wrap传入类,然后@绑定在,我们相传到set_age1上的类,并且在上面加个要传入的age值。就可以在main直接调用该类的类变量了,看着不明显可以转化为 TEST = set_age1(100)(TEST) print(Test.AGE)

def set_age1(age):
    def wrap(cls):
        cls.AGE = age
        return cls
    return wrap

@set_age1(100)
class Test:
    pass

if __name__ == '__main__':
    print(Test.AGE)

image.png

这里是为了动态的获取类的名字,如下图,这里只是为了扩展或者说了解一下罢了。 image.png

image.png

image.png