python基础教程:__call__用法

__call__可以使得方法变成可被调用对象;(PS:python中的方法和普通函数有点区别:方法的第一个参数是类实例)

允许一个类的实例像函数一样被调用。实质上说,这意味着 x() 与 x.__call__() 是相同的。注意__call__参数可变。这意味着你可以定义__call__为其他你想要的函数,无论有多少个参数。

class Entity:
'''调用实体来改变实体的位置'''

def _init_(self,size,x,y):
	self.x,self.y = x,y
	self.size = size
def _call_(self,x,y):
	'''改变实体的位置'''
	self.x, self.y = x,y
	
e = Entity(1,2,3)#创建实例
e(4,5)#实例可以像函数那样执行,并传入x y值,修改对象的x y

实例对象也可以像函数一样作为可调用对象来用,那么,这个特点在什么场景用得上呢?

这个要结合类的特性来说,类可以记录数据(属性),而函数不行(闭包某种意义上也可行),利用这种特性可以实现基于类的装饰器,在类里面记录状态,比如,下面这个例子用于记录函数被调用的次数:

'''
Python大型免费公开课,适合初学者入门
加QQ群:579817333 获取学习资料及必备软件。
'''
class Counter:
	def _init_(self,func):
		self.func = func
		self.count = 0
	
	def _call_(self,*args,**kwargs):
		self.count += 1
		return self.func(*args,**kwargs)

@Counter
def foo():
	pass
for i in range(10):
	foo()

print(foo.count) #10

首先这里的@Counter是装饰器,执行起来顺序是 foo = Counter(foo),实例化,把foo函数传到类Counter里面,并存到对象属性里面,然后返回foo = Counter实例。

这时foo已经是Counter实例,而不是本身foo函数。

PS:__call__这种用法在pytorch中也有所体现,pytorch中自定义的类继承于nn.Module父类,且该子类中对父类的forward方法进行了重载,且父类nn.Module中的__call__中调用了forward方法,所以我们直接用子类的实例作为可调用对象

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值