__call__ 方法


__call__ 是当对象被调用会调用的方法,允许一个对象(类的实例等)像函数一样被调用,也可以传入参数。

 1 class Foo():
2 def __init__(self, x, y):
3 self.x = x
4 self.y = y
5
6 def __call__(self, m, n):
7 print('x is %s, y is %s, m is %s, n is %s' % (self.x, self.y, m, n))
8
9 Foo(1, 2)(3, 4)
10
11 f = Foo(5, 6)
12 f(7, 8)

上面的代码中首先定义了一个 Foo 类,然后定义了 __call__ 方法,此时,这个类所生成的实例便可以像函数一样被调用了。 运行代码输出以下结果,

x is 1, y is 2, m is 3, n is 4
x is 5, y is 6, m is 7, n is 8

从第 9 行和第 12 行中可以看出,实例对象 Foo(1, 2) 和 f 可以像函数一样被调用,此时会调用到内部的 __call__ 方法。

__str__ / __repr__ 方法


__str__ 方法和 __repr__ 方法的作用十分类似,分别对应了 str() 和 repr() 函数,同时 __str__ 方法也是 print() 函数执行时会显示的内容。通过对这两个特殊方法的重载可以改变其显示的内容。其中,__str__ 在 print() 函数,str() 函数,格式化字符串(%s 与 format)中会被调用,而 __repr__ 在 repr() 函数,格式化字符串(%r)等情况下会被调用。

 1 class new(int):
2 # Reload the __str__ function, when print(or format) it, this function will be called
3 def __str__(self):
4 return 'Null'
5
6 # Reload the __repr__ function, when repr(or %r) it, this function will be called
7 def __repr__(self):
8 return str(self+1)
9
10 n = new(7)
11 print(n) # Null
12 print('%s' % n) # Null
13 print('{}'.format(n)) # Null
14 print('%r' % n) # 8

上面的代码中,首先创建了一个新的类,这个类继承自 int 类,也就是拥有 int 类的所有内置方法,此时我们对其内部的 __str__ 和 __repr__ 方法进行重载,定义这个新的类型 __str__ 方法返回 ‘Null’ ,而 __repr__ 方法返回原数值加一的新数值的字符串格式。

Note: 此处值得注意的是 __repr__ 中的 str() 函数调用的是 int 类的 __str__ 函数,而不是自定义的 New 类的 __str__ 函数,因此返回的是数值加一的字符串,而不会产生 ‘Null’+1 的运算错误。这是由于 New 类的 __add__ 方法继承自 int,将 self 与 1 进行相加后返回了一个 int 类型的数值

通过显示输出可以看到,对魔术方法的修改起到了相应的作用。

参考链接


http://www.cnblogs.com/styier/p/6111370.html

Python的程序结构[1] -> 方法/Method[4] -> 魔术方法 __call__ / __str__ / __repr__的更多相关文章

  1. Python的程序结构[1] -> 方法/Method[2] -> 魔术方法 __init__ / __del__ / __new__

    魔术方法 / Magic Method 魔法方法就是可以给你的类增加魔力的特殊方法(实质应称为特殊方法,魔术方法在JavaScript中有所体现,对象具有不透明特性,而且无法在自定义对象中模拟这些行为 ...

  2. Python的程序结构[1] -> 方法/Method[3] -> 魔术方法 __getattr__ 与代理模式

    __getattr__ 方法 __getattr__ 方法当对象调用内部属性(包括方法等)且未找到对应属性的时候会调用的特殊方法.利用这一特性,可是对函数实现一个代理模式. __getattr__方法 ...

  3. Python的程序结构[1] -> 方法/Method[0] -> 类实例方法、私有方法和抽象方法

    类实例方法.私有方法和抽象方法 Python中最常用的就是类实例方法,类似于属性中的类实例属性,同时,也存在与私有属性类似方法,即私有方法,下面介绍这两种常见的方法,以及一种特殊意义的类实例方法 -- ...

  4. C++/Php/Python/Shell 程序按行读取文件或者控制台方法总结。

    C++/Php/Python/Shell 程序按行读取文件或者控制台方法总结. 一.总结 C++/Php/Python/Shell 程序按行读取文件或者控制台(php读取标准输入:$fp = fope ...

  5. 复习python的__call__ __str__ __repr__ __getattr__函数 整理

    class Www: def __init__(self,name): self.name=name def __str__(self): return '名称 %s'%self.name #__re ...

  6. Python的程序结构[1] -> 方法/Method[1] -> 静态方法、类方法和属性方法

    静态方法.类方法和属性方法 在 Python 中有三种常用的方法装饰器,可以使普通的类实例方法变成带有特殊功能的方法,分别是静态方法.类方法和属性方法. 静态方法 / Static Method 在 ...

  7. Python的程序结构[4] -> 函数/Function[0] -> 函数与方法的区别

    函数与方法的区别 / Distinction of Function and Method 关于函数与方法的区别,可根据两者的定义看出, 函数function -- A series of state ...

  8. Python的程序结构[7] -> 生成器/Generator -> 生成器浅析

    生成器 / Generator 目录 关于生成器 生成器与迭代器 生成器的建立 通过迭代生成器获取值 生成器的 close 方法 生成器的 send 方法 生成器的 throw 方法 空生成器的检测方 ...

  9. Python的程序结构[2] -> 类/Class[1] -> 基类与继承

    基类与继承 / Base Class and Inheritance Class 面向对象的特性使得 Python 中不可避免地需要使用到类和类的继承,类的继承可以使得代码很好的被重用.下面以一些代码 ...

随机推荐

  1. NOIP 2018 总结

    NOIP 2018 总结 提高组: 应得分 \(100 + 100 + 40 + 100 + 50 + 44 = 434\). 考后期望得分 \(100 + 100 + 20 + 100 + 50 + ...

  2. Oracle 学习----:Oracle删除表时报错:表或视图不存在

    表明明存在,但是删除时却报错:表或视图不存在. 可能的原因之一是表名包含了小写,可以用双引号包含表名通过drop命令来删除, 如下所示: drop table "tmp_ST" ; ...

  3. django ORM中的表关系

    多对一: 为了方便理解,两个表之间使用ForeignKey连接时,使用ForeignKey的字段所在的表为从表,被ForeignKey连接的表为主表. 使用场景:书和出版社之间的关系,一本书只能由一个 ...

  4. 【Linux】- 获取root权限命令

    1:Redhat系统或者Fedora或者CentOs的Linux发行版,那么在Linux终端输入命令回车: su - root 这样就可以切换到root权限了 2:Ubuntu系统,在Linux终端输 ...

  5. HDU 6034 Balala Power!(贪心+排序)

    Balala Power! Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/Others) ...

  6. [bzoj1033] [ZJOI2008]杀蚂蚁antbuster

    Description 最近,佳佳迷上了一款好玩的小游戏:antbuster.游戏规则非常简单:在一张地图上,左上角是蚂蚁窝,右下角是蛋糕,蚂蚁会源源不断地从窝里爬出来,试图把蛋糕搬回蚂蚁窝.而你的任 ...

  7. P1494 [国家集训队]小Z的袜子/莫队学习笔记(误

    P1494 [国家集训队]小Z的袜子 题目描述 作为一个生活散漫的人,小\(Z\)每天早上都要耗费很久从一堆五颜六色的袜子中找出一双来穿.终于有一天,小\(Z\)再也无法忍受这恼人的找袜子过程,于是他 ...

  8. powerdesign相关

    1.安装程序和汉化放百度云了 2.打印错误处理 http://jingyan.baidu.com/article/c45ad29cd84e4b051753e2c3.html 3.导出sql http: ...

  9. 封装scroll()

    function scroll(){ if(window.pageYOffset !== undefined){ return { "top": window.pageYOffse ...

  10. CodeForces Round #403 (Div.2) A-F

    精神不佳,选择了在场外同步划水 没想到实际做起来手感还好,早知道就报名了…… 该打 未完待续233 A. Andryusha and Socks 模拟,模拟大法好.注意每次是先判断完能不能收进柜子,再 ...