【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__吗?那我理解就只能装饰一个功能,那为何不用普通的函数装饰器。[疑惑]
【回复】想让被装饰的函数除了被直接调用以外,还可以支持一些统一的方法
【回复】回复 @ドラえもん :可能是我表达问题,我的意思是在什么情况下用类装饰器,类装饰器比函数装饰器好在哪里,而不是装饰器的作用
【回复】回复 @ドラえもん :那为什么不直接继承呢[思考]