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 的一切. 他们是可以给你的类增加魔力的特殊方法,如果你的对象实现(重载)了这些方法中的某一个, ...
随机推荐
- LeetCode No.82,83,84
No.82 DeleteDuplicates 删除排序链表中的重复元素 II 题目 给定一个排序链表,删除所有含有重复数字的节点,只保留原始链表中 没有重复出现 的数字. 示例 输入: 1->2 ...
- OpenCV 级联分类器
#include "opencv2/objdetect/objdetect.hpp" #include "opencv2/highgui/highgui.hpp" ...
- emacs 入门第一课:Emacs里的基本概念
Table of Contents 无聊的开场白 buffer(缓冲区) window(窗口)与frame Emacs的mode Emacs Lisp 函数function.命令command.键绑定 ...
- Java入门级文件下载_学习笔记
文件下载和上一篇文件上传很像,就不多说了,传一个我写的一个下载歌曲的代码: 下面是Servlet代码: public class DownLoadServlet extends HttpServlet ...
- C# 开启线程的几种方式
1.异步委托开启线程 public static void Main(string[] args) { Action<int,int> a=add; a.BeginInvoke(,,nul ...
- 常胜将军的深思变局:OPPO的渐变释放了怎样的行业信号?
在经过了前几年的狂飙突进后,当下手机行业已经步入了自身的"十年之痒"阶段.利润贴地飞行.T型格局已定且竞争者实力愈强.创新不明显导致消费者换新驱动力降低.全球化竞争趋势凸显-- 也 ...
- WordPress调用page页面内容方法
WordPress调用page页面内容方法,有时候在特殊条件下,原有的wordpress页面获取内容代码不能正常使用,这个时候不能通过wordpress自带的模板标签输出,就需要改变下方式,通过PHP ...
- python 前端素材提供
小图标素材:http://fontawesome.dashgame.com/
- google搜索运算符+101个Google技巧 - Google技巧的终极收集
下面内容整理自网络 搜索运算符 如果您使用我们的基本搜索技巧后,并未找到想要搜索的内容,可以尝试使用搜索运算符.您只需在 Google 搜索框中将这些符号或字词添加到搜索字词中,即可更好地掌控要显示的 ...
- Matplotlib简单回顾
import numpy as np from pylab import * from matplotlib import pyplot as plt x = [1, 2, 3, 4] y = [3, ...