【python】一个公式解决所有复杂的装饰器,理解了它以后任何装饰器都易如反掌!

作者: 码农高天分类: 计算机技术 发布时间: 2022-03-24 14:26:26 浏览:39841 次

【python】一个公式解决所有复杂的装饰器,理解了它以后任何装饰器都易如反掌!

colour4:
万能公式: function = decorator(function) ; class = decorator(class)[吃瓜]

谷風天音:
up下一期有兴趣讲一下可变对象、不可变对象和深浅拷贝吗

【回复】回复 @铁铲胡桃 :简单说:py中一切都是对象,也就是类似java或C++中new出来的,然后所有变量(包括list的元素,dict的kv对)都是句柄引用(也就是C++的指针,或java的引用),哪怕是一个int,也是在堆上的一个对象,用指针来操作,所有的赋值,都是指针赋值 至于可变和不可变,那是对象本身的public方法集合来决定的
【回复】回复 @铁铲胡桃 :不光这个,还有a=1;b=a;a+=1这个代码,如果导致b也变了,就会有些奇怪,当然我要说这种设计也不是不行,只要逻辑自洽即可,但是它在处理实际需求的时候要更麻烦一些,你要真这么设计语言,估计会出现a=1;b=a.copy();a+=1这种代码了,内存压力一样大,而且cpu也会有压力了 有些时候,语言设计可看做是结合现实的一种折中,比如py的tuple和list的区别,可以看做一个不可变一个可变,所以tuple可以做dict的key(当然前提是tuple的元素或元素的元素等都是不可变),不过有的语言,比如ruby,就直接可以将list做dict的key,不过这种语言也必然在其他方面有一些限制或麻烦了
【回复】回复 @冒-_-泡 :我明白py中一切都是对象的原理,也明白指针,但我觉得很疑惑,在设计之初为什么要让int类型的对象不可变,或者说这样有什么好处 比如说 a = 1000 print(id(a)) a += 1 print(id(a)) 这时候两个id就会不相同,这样做不会增加内存的负担吗
冒-_-泡:
可以再展开讲讲 class A: @x def f(self): pass 等价于 class A: def f(self): pass f = x(f) 所以接下来可以讲讲类的生成过程了(为何class下面的代码块可以有可执行代码等)

同和君Hocassian:
下一个话题:偏函数和装饰器有什么区别

崇弈:
装饰器跟mixin的区别是不是在自动和手动运行上?[思考]

死线疾风:
终于明白了,明天就给我的代码戴帽子[吃瓜]

未の_:
类方法的装饰器是怎么回事 因为有self不是很理解 比如 def timer(func): def wrapper(*args, **kwargs): start = time() func(*args, **kwargs) print(f'耗时 {time() - start}') return wrapper class Task: @timer def run(self): print('任务开始执行') sleep(1) print('任务执行结束') task.run()

REDMC4869:
问一个比较套娃的问题,那有没有修饰类的类装饰器,或者写出这个东西有没有实际、独特的用处?

刻舟行远:
这个万能公式自己当年学的时候也看了很多文章视频总结了出来,只能说低水平内容还是多,一个公式就能讲明白的事情,结果能查到的基本净是枚举出来让你硬背的……

喵呜爽:
代码敲击了一模一样的,但是报错:TypeError: Timer() takes no arguments 有人遇到类似的问题吗?求解

【回复】@Timer(prefix="curr_time:") TypeError: Timer() takes no arguments
【回复】一样遇到了 可以问下你怎么解决的吗?
月隐灯寒:
请教一个问题:不带参数的装饰器类该怎么使用 @functools.wraps 呢?

【回复】找到了,可以用 functools.update_wrapper
tensoRRR:
add = Timer(add) 一看就是实例化Timer类,然后就是在Timer的__init__()里面传入add,既然是 实例()形式访问那就得该类必须有__call__()[捂眼]

奥杜刷:
不同就问,装饰器的类 有什么实际应用,一个类里不是只能写一个__call__吗?那我理解就只能装饰一个功能,那为何不用普通的函数装饰器。[疑惑]

【回复】想让被装饰的函数除了被直接调用以外,还可以支持一些统一的方法
【回复】回复 @ドラえもん :可能是我表达问题,我的意思是在什么情况下用类装饰器,类装饰器比函数装饰器好在哪里,而不是装饰器的作用
【回复】回复 @ドラえもん :那为什么不直接继承呢[思考]

学习 科技 原创 程序员 计算机 编程 计算机技术 python 编程开发 打卡挑战

如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!

更多相关阅读