python基础教程:__call__用法
2024-09-08 14:13:44
__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
实例对象也可以像函数一样作为可调用对象来用,那么,这个特点在什么场景用得上呢?
这个要结合类的特性来说,类可以记录数据(属性),而函数不行(闭包某种意义上也可行),利用这种特性可以实现基于类的装饰器,在类里面记录状态,比如,下面这个例子用于记录函数被调用的次数:
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方法,所以我们直接用子类的实例作为可调用对象
最新文章
- 代码的坏味道(11)——霰弹式修改(Shotgun Surgery)
- SJPullDownMenu下拉菜单框架使用
- BZOJ 3157 &;数学乱搞...
- postfix config
- easy UI获取数据,打开毕弹窗
- BZOJ4241 历史研究
- compass做雪碧图
- 转载:Github 简明教程
- HDU 4681 String 最长公共子序列
- Php 魔术常量
- 用 Webgoat 撬动地球,看安全测试的引路石!
- Nginx 的 Location 配置指令块
- Spring整合Hibernate笔记
- Spark SQL数据加载和保存实战
- 搭建ruby环境
- SSIS - 1.简介
- [20180810]exadata--豆腐渣系统的保护神.txt
- HDU 2844 Coins 【多重背包】(模板)
- python-and和 or用法
- Intellij Idea修改css文件即时更新生成效果
热门文章
- Educational Codeforces Round 108 (Div. 2), C map套vector存储
- 2021.10.29 P1649 [USACO07OCT]Obstacle Course S(BFS)
- Flex 的 多种对齐属性
- esp8266 esp01s wifi继电器 初步点灯成功!艰难的历程啊,期间差点烧了
- Spring Security开发安全的REST服务
- 『忘了再学』Shell基础 — 21、变量的测试与内容置换
- ptorch常用代码梯度篇(梯度裁剪、梯度累积、冻结预训练层等)
- 对 Python 中 GIL 的一点理解
- 声学感知刻度(mel scale、Bark scale、ERB)与声学特征提取(MFCC、BFCC、GFCC)
- 【Java面试】JVM如何判断一个对象可以被回收