前言

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. 吴裕雄 python 神经网络——TensorFlow 卷积神经网络水果图片识别

    #-*- coding:utf- -*- import time import keras import skimage import numpy as np import tensorflow as ...

  2. python面向对象小tips

    (一).python鸭子类型 python作为动态语言继承和多态与静态语言(像java)有很大的不同:比如说在java中的某个方法,如果传入的参数是Animal类型,那么传入的对象必须是Animal类 ...

  3. HLS图像处理总结(一)

    HLS工具 以个人的理解,xilinx将HLS(高层次综合)定位于更方便的将复杂算法转化为硬件语言,通过添加某些配置条件HLS工具可以把可并行化的C/C++的代码转化为vhdl或verilog,相比于 ...

  4. Serializable 接口(序列化)

    目录 Serializable 接口(序列化) 前言 用途 如何实现 异常 serialVersionUID transient关键字 Serializable 接口(序列化) 前言 查看API文档时 ...

  5. SQL语言:DDL,DML,DCL,DQL,TCL

    DDL(Data Definition Language)数据库定义语言 statements are used to define the database structure or schema. ...

  6. 详解JavaScript Document对象

    转自:http://segmentfault.com/a/1190000000660947 在浏览器中,与用户进行数据交换都是通过客户端的javascript代码来实现的,而完成这些交互工作大多数是d ...

  7. Kafka与RabbitMQ、ActiveMQ协议区别

    对于Kafka与RabbitMQ.ActiveMQ协议,它们具体的区别如下: activemq:        activemq支持主从复制.集群.但是集群功能看起来很弱,只有failover功能,即 ...

  8. SWUST OJ 有趣的三位数(0319)

    有趣的三位数(0319) Time limit(ms): 1000 Memory limit(kb): 65535 Submission: 158 Accepted: 62   Description ...

  9. Python---13面向对象编程

    一.类和实例 面向对象最重要的概念就是类(Class)和实例(Instance),必须牢记类是抽象的模板,比如Student类,而实例是根据类创建出来的一个个具体的“对象”,每个对象都拥有相同的方法, ...

  10. 看完这篇还不了解 Nginx,那我就哭了!

    作者:蔷薇Nina www.cnblogs.com/wcwnina/p/8728391.html 想必大家一定听说过 Nginx,若没听说过它,那么一定听过它的"同行"Apache ...