1、打印操作会首先尝试__str__和str内置函数,他通常返回一个用户友好显示。__repr__用于所有其他环境,用于交互式模式下提示回应以及repr函数,如果没有使用__str__,则会使用print和str。它通常返回一个编码字符串,可以用来重新创建对象,或则给开发者一个详细的显示。总而言之,除了当定义一个__str__的时候,使用print和str。然而需要注意,如果没有定义__str__,打印还是使用__repr__,反过来不成立。在交互模式下,只适用__repr__,并且根本不尝试__str__.

2、__str__,__repr__都必须返回字符串,返回其他类型会抱错。还有一个需要注意的是,__str__的用户友好显示可能只有对象出现在一个打印操作的顶层时候才应用,嵌套 到较大对象中 的对象 可能用其__repr__或默认方法打印。

例如:

class Printer:

def __init__(self,val):

self.val = val

def __str__(self):

return str(self.val)

obj = [Printer(2),Printer(3)]

for x in obj:

print(x) #输出:2 3

print(obj) #输出:[<__main__.printer object at>, <__main__.printer object at>]

但是__repr__能够解决前面提的那个问题

class Printer:

def __init__(self,val):

self.val = val

def __repr__(self):

return str(self.val)

obj = [Printer(2),Printer(3)]

for x in obj:

print(x) #输出:2 3

print(obj) #输出:2,3

3、右侧加法和原处加法:__radd__,__iadd__

class adder:

def __init__(self,value=0):

self.data = value

def __add__(self,,other):

self.data+=other

adder只是在+左边是对象时使用,如果要支持右侧使用实例对象,则需要重载 __radd__.

例如:

class Commuter:

def __init__(self,val):

self.val = val

def __add__(self,other):

print('add',self.val,other)

return self.val+other

def __radd__(self,other):

print('radd',self.val,other)

return other+self.val #这个 顺序无所谓,只是在调用的时候很位置很重要

x = Commuter(88)

y = Commuter(99)

print(x+1)

print('#'*8)

print(1+y)

print('$'*8)

print(x+y)

#输出结果如下:

add 88 1

89

########

radd 99 1

100

$$$$$$$$

add 88 <__main__.commuter object at>

radd 99 88

187

原处加法: __iadd__或者__add__但是__iadd__更高效

class Number:

def __init__(self,val):

self.val = val

def __iadd__(self,other):

self.val+=other

return self

x = Number(5)

x+=1

x+=1

print(x.val) #输出:7

或者

class Number:

def __init__(self,val):

self.val = val

def __add__(self,other):

return Number(self.val+other)

4、call表达式:__call__

有关python的__call__在官方文档上有这么一句解释 (http://docs.python.org/reference/datamodel.html?highlight=__call__#object.__call__)

object.__call__(self[, args...])

Called when the instance is “called” as a function; if this method is defined, x(arg1, arg2, ...) is a shorthand for x.__call__(arg1, arg2, ...).

当把一个实例当作方法来调用的时候,形如instance(arg1,args2,...),那么实际上调用的就是 instance.__call__(arg1,arg2,...)

例如:

class Prod:

def __init__(self,value):

self.value = value

def __call__(self,other):

return self.value *other

x = Prod(2)

print(x(3)) #输出:6

5、比较:__lt__,__gt__和其他方法

比较运算没有位置限制。

比较运算没有隐士关系,比如说 == 为真并不以为着 !=为假

python2.6中如果没有定义更为具体的比较方法,对其使用一个__cmp__或者内置cmp函数。

cmp( x, y)

Compare the two objects x and y and return an integer according to the outcome. The return value is negative if x < y, zero if x == y and strictly positive if x > y.

class C:

def __init__(self,data):

self.data = data

def __gt__(self,other):

return self.data > other

def __lt__(self,other):

return self.data < other

x = C('spam')

print('1',x >'ham')

print('2','ham'> x)

print('3',x < 'ham')

print('4','ham'

y = C('ham')

print('5',x

print('6',x>y)

6、布尔测试:__bool__,__len__

在布尔环境中,python首先尝试__bool__来获取一个直接布尔值,然后如果没有该方法,就尝试__len__类根据对象的长度确定 一个真值。

7、对象析构函数:__del__

每当实例产生时,就会调用__init__构造函数,每当 实例空间被回收时,就会执行析构函数。

class Life:

def __init__(self,name='unknow'):

print('hello ',name)

self.name = name

def __del__(self):

print('Goodbye',self.name)

brain = Life('Brain')#输出 hello brain

brain = 'loretta' #输出: Goodbye brain

python比较运算符重载_python运算符重载相关推荐

  1. [转载] python 等号 重载_python运算符重载2

    参考链接: Python运算符重载 1.重载构造函数和减法运算__init__,__sub__ #file number.py class Number: def __init__(self,data ...

  2. python中小于号的重载_Python操作符重载

    可以根据所使用的操作数更改Python中运算符的含义.这种做法被称为运算符重载. Python操作系统适用于内置类. 但同一运算符的行为在不同的类型有所不同. 例如,+运算符将对两个数字执行算术加法, ...

  3. python加法赋值运算符为_Python 运算符

    Python 运算符 什么是运算符? 本章节主要说明Python的运算符.举个简单的例子4 +5 = 9. 例子中,4和5被称为操作数,"+"号为运算符. Python语言支持以下 ...

  4. python关系运算符实例_python运算符详解

    运算符的作用 运算符是表达式的组成单元. 01.数学运算符 数学运算符返回的是数字. 数学运算符 示例 02.比较运算符 比较运算符返回的是真假. 比较运算符 示例 03.逻辑运算符 and:X an ...

  5. python做表格计算_python运算符表格

    什么是操作符? 简单的回答可以使用表达式4 + 5等于9,在这里4和5被称为操作数,+被称为操符. Python语言支持操作者有以下几种类型. 算术运算符 比较(即关系)运算符 赋值运算符 逻辑运算符 ...

  6. python 重载_python模块重载的五种方法

    环境准备 新建一个 foo 文件夹,其下包含一个 bar.py 文件 bar.py 的内容非常简单,只写了个 print 语句 只要 bar.py 被导入一次,就被执行一次 print 禁止重复导入 ...

  7. python中优先级最高的运算符为_Python 运算符优先级

    Python 运算符优先级 目前,我们已经学习了"算术"."条件"."逻辑"运算符,如果,当这些运算符同时出现在同一行代码时,那么,究竟它们 ...

  8. python或运算 条件_Python运算符及条件语句

    1.Python运算符 Python语言支持以下类型的运算符: 算术运算符 比较(关系)匀速那副 赋值运算符 逻辑运算符 位运算符 成员运算符 身份运算符 运算符优先级 Python算术运算符 以下假 ...

  9. python运算符讲解_python运算符讲解

    #软件工具:Sublime Text #因为变量名相同,执行前把之前的语句注释掉再执行 #运算符讲解 #1.加号运算符:+ a = 11 b = 22 c = a + b print(c) #结果为3 ...

最新文章

  1. 端到端伪激光图像3D目标检测
  2. HRFormer,内存和参数降低40%
  3. 深入浅出UML类图(一)
  4. java枚举类使用 == 还是equals来进行比较
  5. QUIC实战(二) AWS 搭建nginx(http3.0) + upsync + consul(server-client模式) 集群
  6. eclipse创建神经网络_使用Eclipse Deeplearning4j构建简单的神经网络
  7. Java EE CDI ConversationScoped示例
  8. 我的 11 年编程生涯
  9. 1.3编程基础之算术表达式与顺序执行 12 计算球的体积
  10. koa ajax,nodejs之koa2请求示例(GET,POST)
  11. 在PL/SQL中使用随机数和GUID
  12. VideoEdit+ User Manual
  13. Android中识别手柄JAVA_android的游戏手柄开发测试代码
  14. int和Interger区别
  15. 堆和栈得区别--向WXP学习
  16. 区分bug 前后端归属之后,我再也不背锅了
  17. 从迷之自信到逻辑自信(简版)
  18. python:selenium库进行网易云歌曲匹配播放
  19. Blink/Flink作业 性能优化配置及原理
  20. 建筑八大员培训湖北质量员培训工程质量监督管理的措施和原则

热门文章

  1. 子集和问题 算法_子集问题 主要是去重算法
  2. 必填校验加变色,点击颜色消失
  3. CSDN Chrome插件来啦,听说可以提升开发者效率,我们先来研究一波
  4. win7远程多用户登录此计算机无法,win7如何实现远程桌面多用户登录|win7实现多用户登录远程桌面的方法...
  5. 降雨插值_ArcGIS计算土壤侵蚀模数(二)降雨侵蚀力因子R计算
  6. 怎样呵护友谊_【家校联动共同呵护孩子健康成长科普课堂】关爱学生心理健康,守护学生健康成长...
  7. linux怎么安装高德导航软件,高德地图车机版如何安装?高德地图车机版安装教程...
  8. [one day one question] safari缓存太厉害
  9. 移动端日期选择插件rolldate
  10. 「SDOI2014」数数 解题报告