Python中currying风格add类累加代码的运行原理咨询
解析add类的运行逻辑
先看你贴的代码:
class add(int): def __call__(self, int): return add(self + int) result = add(2) print(result) print(result(4))
为什么print(result)输出2,print(result(4))输出6?
add类继承自Python内置的int类,所以add的实例本质就是一个整数对象。result = add(2)相当于创建了一个值为2的add实例,直接打印它时,会调用int类自带的字符串转换逻辑,输出数值2。- 当你把实例当作函数调用(比如
result(4)),会触发类里定义的__call__方法:这个方法把当前实例的数值(也就是2)和传入的参数4相加,得到6,然后用这个结果创建一个新的add实例返回。打印这个返回的实例时,同样会输出它的数值6。
整数2是否确实被存储在result中?实例化不传参数输出0的底层实现?
- 是的,
result作为add的实例,继承自int,而int实例本身就会存储对应的整数值,所以2确实存在result内部。 - 当你不传参数实例化
add(result = add())时,会调用父类int的无参构造方法。Python内置的int类在无参调用时,默认返回值为0的整数对象,所以add()会创建一个值为0的实例,打印时就输出0。
为什么调用result(2)(3)(4)会输出9?
这是链式调用的结果:
- 第一步
result(2):调用__call__,2+2=4,返回add(4); - 第二步
add(4)(3):对新返回的实例调用__call__,4+3=7,返回add(7); - 第三步
add(7)(4):再次调用__call__,7+4=9,返回add(9); - 最终打印这个实例时,输出它的数值9。
内容的提问来源于stack exchange,提问作者Trance2000
相关产品推荐
相关产品推荐

