Python魔法方法之 __call__
前言
Python的魔法方法是指Python内部已经包含的,被双下划线所包围的方法,这些方法在特定的操作时会自动被调用。
魔法方法可以使Python的自由度变得更高,当不重载魔法方法时它可以在规定的默认情况下生效,也可以根据自己的需求来重载分魔法方法来达到自己的目的。
__call__()
__call__(self,[*args]) 允许一个类实例对象能像函数那样被调用。在介绍__call__之前,我们来先来介绍一个概念,可调用对象:
在Python中,凡是可以将()直接应用到自身并执行,都可以称为 可调用对象,它包括 自定义函数,内置函数,类。
判断一个对象是否是可调用对象,我们可以用Python内置的函数callable(),如我们定义了类str_cls,我们可以用它来判断是否是个可调用对象:
>>> class str_cls():
... pass
... >>> callable(str_cls)
True # 对实例对象 a 做判断 >>> a = str_cls()
>>> callable(a)
False
可以看到,类是可调用对象,实例对象不是可调用对象,而一旦在类内部实现了 __call__ 方法,那么该类创建的实例对象也将称为一个可调用对象,看下面示例:
>>> class Animal():
... def __init__(self,name,age):
... self.name = name
... self.age = age
... def __call__(self,food):
... print("my name is %s,i'm %d old" %(self.name,self.age))
... print('i eat %s' % food)
...
>>> dog = Animal('dog',12)
>>> callable(Animal)
True
>>> callable(dog)
True
>>> dog('milk')
my name is dog,i'm 12 old
i eat milk
可以看到,我们在类Animal中实现了__call__方法,实例对象dog也是可调用对象,并且 dog('milk') 实际上是调用了__call__(self,food)方法.
如果没有实现__call__方法,那么去调用dog('milk'),会抛出异常提示Animal实例对象是不可调用的: TypeError: 'Animal' object is not callable
Python魔法方法之 __call__的更多相关文章
- Python魔法方法总结及注意事项
1.何为魔法方法: Python中,一定要区分开函数和方法的含义: 1.函数:类外部定义的,跟类没有直接关系的:形式: def func(*argv): 2.方法:class内部定义的函数(对象的方法 ...
- python魔法方法大全
1.python魔法方法详解: python魔法方法是可以修改重载的,如果你的对象实现(重载)了这些方法中的某一个,那么这个方法就会在特殊的情况下被 Python 所调用,你可以定义自己想要的行为,而 ...
- 1. Python 魔法方法
Python 魔法方法 基础: 如果你想... 所以,你写... Python调用... 初始化一个实例 x = MyClass() x.__init__() 作为一个字符串的"官方&quo ...
- with上下文管理 python魔法方法
with语法在Python里很常见, 主要的利好是使用代码更简洁. 常见的使用场景有: 1. 资源对象的获取与释放. 使用with可以简化try...finally ... 2. 在不修改函数代码的前 ...
- python魔法方法:__getattr__,__setattr__,__getattribute__
python魔法方法:__getattr__,__setattr__,__getattribute__ 难得有时间看看书....静下心来好好的看了看Python..其实他真的没有自己最开始想的那么简单 ...
- python 魔法方法补充(__setattr__,__getattr__,__getattribute__)
python 魔法方法补充 1 getattribute (print(ob.name) -- obj.func())当访问对象的属性或者是方法的时候触发 class F(object): def _ ...
- python 魔法方法诠释
什么是Python魔法方法 什么是魔法方法呢?它们在面向对象的Python的处处皆是.它们是一些可以让你对类添加"魔法"的特殊方法. 它们经常是两个下划线包围来命名的(比如 ini ...
- python 魔法方法
I am not a creator, I just a porter. Note: Everything is object in python. 对于Python来说一切都是对象,也就是函数的参数 ...
- Python 魔法方法详解
据说,Python 的对象天生拥有一些神奇的方法,它们总被双下划线所包围,他们是面向对象的 Python 的一切. 他们是可以给你的类增加魔力的特殊方法,如果你的对象实现(重载)了这些方法中的某一个, ...
随机推荐
- WebSecurityConfig
package me.zhengjie.core.config; import me.zhengjie.core.security.JwtAuthenticationEntryPoint; impor ...
- 【转】Mac下显示User下的资源Library
在Mac OS 中Library文件夹是默认不显示的,这对普通用户来说是有好处的,可以防止用户误操作删除Library文件夹,但对于iOS的开发者来说是非常麻烦的,特别是ArcGIS Runtime ...
- 1 jquery对checkbox的简单操作
//全选和全不选 votefunction selectAll(){ if($(":checkbox").prop('checked')){ //$(":chec ...
- Promise的用法(js&java)
Promise(onsuccess , on fail) f1.then(f2.then(), f3.then()) java CompletableFuture.thenAccept
- LeetCode Day 3
LeetCode0003 给定一个字符串,请你找出其中不含有重复字符的最长子串的长度. 示例 1: 输入: "abcabcbb" 输出: 3 解释: 因为无重复字符的最长子串是 & ...
- 隐藏windows7/8“卸载或更改程序”里的软件
隐藏windows7/8“卸载或更改程序”里的软件 通过修改注册表即可隐藏电脑中已安装的软件,这个方法会造成卸载列表无法加载已安装的软件,请谨慎操作!提示:删除注册表后windows自带的卸载程序.其 ...
- JavaScript学习总结(四)function函数部分
转自:http://segmentfault.com/a/1190000000660786 概念 函数是由事件驱动的或者当它被调用时执行的可重复使用的代码块. js 支持两种函数:一类是语言内部的函数 ...
- fiddler模拟返回响应数据
通过find查找修改指定内容 选择find a file 保存后重新发起请求
- Zabbix 监控进程参考
1)zabbix自动发现占用内存最大top10进程并监控资源 http://blog.csdn.net/ybx13218464908/article/details/47819401
- Tuning xgboost in R:Part 1
第一次调整Boosting算法的参数可能是一个非常艰难的任务.有很多参数可供选择,调整不同的参数会有不同的结果产生.最好的调参可能是取决于数据.每当我得到一个新的数据集,我都会学到一些新的东西.对分类 ...