前言

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__的更多相关文章

  1. Python魔法方法总结及注意事项

    1.何为魔法方法: Python中,一定要区分开函数和方法的含义: 1.函数:类外部定义的,跟类没有直接关系的:形式: def func(*argv): 2.方法:class内部定义的函数(对象的方法 ...

  2. python魔法方法大全

    1.python魔法方法详解: python魔法方法是可以修改重载的,如果你的对象实现(重载)了这些方法中的某一个,那么这个方法就会在特殊的情况下被 Python 所调用,你可以定义自己想要的行为,而 ...

  3. 1. Python 魔法方法

    Python 魔法方法 基础: 如果你想... 所以,你写... Python调用... 初始化一个实例 x = MyClass() x.__init__() 作为一个字符串的"官方&quo ...

  4. with上下文管理 python魔法方法

    with语法在Python里很常见, 主要的利好是使用代码更简洁. 常见的使用场景有: 1. 资源对象的获取与释放. 使用with可以简化try...finally ... 2. 在不修改函数代码的前 ...

  5. python魔法方法:__getattr__,__setattr__,__getattribute__

    python魔法方法:__getattr__,__setattr__,__getattribute__ 难得有时间看看书....静下心来好好的看了看Python..其实他真的没有自己最开始想的那么简单 ...

  6. python 魔法方法补充(__setattr__,__getattr__,__getattribute__)

    python 魔法方法补充 1 getattribute (print(ob.name) -- obj.func())当访问对象的属性或者是方法的时候触发 class F(object): def _ ...

  7. python 魔法方法诠释

    什么是Python魔法方法 什么是魔法方法呢?它们在面向对象的Python的处处皆是.它们是一些可以让你对类添加"魔法"的特殊方法. 它们经常是两个下划线包围来命名的(比如 ini ...

  8. python 魔法方法

    I am not a creator, I just a porter. Note: Everything is object in python. 对于Python来说一切都是对象,也就是函数的参数 ...

  9. Python 魔法方法详解

    据说,Python 的对象天生拥有一些神奇的方法,它们总被双下划线所包围,他们是面向对象的 Python 的一切. 他们是可以给你的类增加魔力的特殊方法,如果你的对象实现(重载)了这些方法中的某一个, ...

随机推荐

  1. WebSecurityConfig

    package me.zhengjie.core.config; import me.zhengjie.core.security.JwtAuthenticationEntryPoint; impor ...

  2. 【转】Mac下显示User下的资源Library

    在Mac OS 中Library文件夹是默认不显示的,这对普通用户来说是有好处的,可以防止用户误操作删除Library文件夹,但对于iOS的开发者来说是非常麻烦的,特别是ArcGIS Runtime ...

  3. 1 jquery对checkbox的简单操作

    //全选和全不选 votefunction selectAll(){ if($(":checkbox").prop('checked')){     //$(":chec ...

  4. Promise的用法(js&java)

    Promise(onsuccess , on fail) f1.then(f2.then(), f3.then()) java CompletableFuture.thenAccept

  5. LeetCode Day 3

    LeetCode0003 给定一个字符串,请你找出其中不含有重复字符的最长子串的长度. 示例 1: 输入: "abcabcbb" 输出: 3 解释: 因为无重复字符的最长子串是 & ...

  6. 隐藏windows7/8“卸载或更改程序”里的软件

    隐藏windows7/8“卸载或更改程序”里的软件 通过修改注册表即可隐藏电脑中已安装的软件,这个方法会造成卸载列表无法加载已安装的软件,请谨慎操作!提示:删除注册表后windows自带的卸载程序.其 ...

  7. JavaScript学习总结(四)function函数部分

    转自:http://segmentfault.com/a/1190000000660786 概念 函数是由事件驱动的或者当它被调用时执行的可重复使用的代码块. js 支持两种函数:一类是语言内部的函数 ...

  8. fiddler模拟返回响应数据

    通过find查找修改指定内容 选择find a file 保存后重新发起请求

  9. Zabbix 监控进程参考

    1)zabbix自动发现占用内存最大top10进程并监控资源 http://blog.csdn.net/ybx13218464908/article/details/47819401

  10. Tuning xgboost in R:Part 1

    第一次调整Boosting算法的参数可能是一个非常艰难的任务.有很多参数可供选择,调整不同的参数会有不同的结果产生.最好的调参可能是取决于数据.每当我得到一个新的数据集,我都会学到一些新的东西.对分类 ...