方法

重载

调用

__init__ 构造函数 x = Class()
__del__ 析构函数 del x
__str__ 打印 print x
__call__ 调用函数 x(*args)
__getattr__ 获取属性 y = x.method
__setattr__ 设置属性 x.any = value
__getitem__ 获取索引 x[key]
__setitem__ 设置新索引 x[key] = value
__len__ 长度 len(x)
__iter__ 迭代 for item in x:
__add__ x + y
__sub__ x - y
__mul__ x * y
__radd__    
__iadd__ 左加 += x += y
__or__ 或 | x | y
__cmp__ 比较 == x == y
__lt__ 小于 < x < y
__eq__ 等于 = x = y

减法重载

重载"-" 不同对象的减法处理

class Number:
def __init__(self,start):
self.data=start
def __sub__(self,other):
return Number(self.data-other)
number=Number(20)
y=number-10
print number.data, y.data

重载"-" 相同对象的减法处理

class Big :
def __init__(self,a,b):
self.a=a
self.b=b
def __sub__(self,other):#other不用事先制定类型,可以直接当做一个Big来用
return Big(self.a-other.a,self.b-other.b)
i=Big(20,12);
j=Big(23,4);
k=i-j;
print k.a ,k.b

重载"+"

class AddOperator :
def __init__(self,a,b):
self.a=a
self.b=b
def __add__(self,other):#other不用事先制定类型,可以直接当做一个Big来用
return Big(self.a+other.a,self.b+other.b)
i=AddOperator(20,12);
j=AddOperator(23,4);
k=i+j;
print k.a ,k.b

重载"+="

class AddOperator :
def __init__(self,a,b):
self.a=a
self.b=b
def __iadd__(self,other):#other不用事先制定类型,可以直接当做一个Big来用
return Big(self.a+other.a,self.b+other.b)
i=AddOperator(20,12);
j=AddOperator(23,4);
i+=j;
print i.a ,i.b

重载乘法

不同对象的乘法:

class MulOperator:
def __init__(self,a,b):
self.a=a
self.b=b
def __mul__(self,n):
return MulOperator(self.a*n,self.b*n)
i=MulOperator(20,5)
j=i*4.5
print j.a,j.b

索引重载

class indexer:
def __getitem__(self, index): #iter override
return index ** 2
X = indexer()
X[2]
for i in range(5):
print X[i] class indexer:
def __setitem__(self, key,value): #iter override
self.mydict[key] = value
return self.mydict
X = indexer() X[2] = 'test' # 它等于调用 X.__setitem__(2, 'test')

打印重载

class adder :
def __init__(self,value=0):
self.data=value
def __add__(self,other):
self.data+=other
class addrepr(adder):
def __repr__(self):
return "addrepr(%d)"% self.data # %d ,%s都可以
x=addrepr(2)
x+1
print x ,repr(x)
i=3;
print "%s---%d"% (i, i)

调用重载

__call__相当与 X()

class Prod:
def __init__(self, value):
self.value = value
def __call__(self, other):
return self.value * other p = Prod(2) # call __init__
print p(1) # call __call__
print p(2)

析构重载 __del__

class Life:
def __init__(self, name='name'):
print 'Hello', name
self.name = name
def __del__(self):
print 'Goodby', self.name brain = Life('Brain') # call __init__
brain = 'loretta' # call __del__

重载"|"

class Mat :
def __init__(self,value):
self.age=value
def __or__(self,other):
return self.age!=0 and other.age!=0
a=Mat(10)
b=Mat(21)
c=Mat(0)
print a|b ,a|c

打印转换重载

class PrintOperator:
def __init__(self,a):
self.a=a
def __str__(self,b=50):
return "I am %s years old!" % self.a
i=PrintOperator(10)
print i, str(i)

长度重载

class lenOperator:
def __init__(self,a,b,c):
(self.a,self.b,self.c)=(a,b,c)
def __len__(self):
return 3
a=lenOperator(0,2,4)
print len(a)

cmp重载

class cmpOperator:
def __init__(self,a,b,c):
(self.a,self.b,self.c)=(a,b,c)
def __cmp__(self,other):
if self.a>other.a:
return 1
elif self.a<other.a:
return -1
elif self.b>other.b:
return 1
elif self.b<other.b:
return -1
elif self.c>self.c:
return 1
elif self.c<self.c:
return -1
elif self.c==self.c:
return 0
i=cmpOperator(1,2,3)
j=cmpOperator(2,4,5)
k=cmpOperator(2,4,5)
a=cmpOperator(1,4,5)
print cmp(i,j),cmp(j,k),cmp(a,i)

delattr重载

class delattrOperator(object):
def __init__(self,a,b):
(self.a,self.b)=(a,b)
def __delattr__(self,name):
print "del obj.%s" % name
object.__delattr__(self,name)
a=delattrOperator(1,2)
print a.a,a.b
del a.a
print a.b
# print a.a 打印a会出错,a已经被删除。

getAttr/setAttr重载

class empty:
def __getattr__(self,attrname):
if attrname == 'age':
return 40
else:
raise AttributeError,attrname
X = empty()
print X.age # call__getattr__ class accesscontrol:
def __setattr__(self, attr, value):
if attr == 'age':
# Self.attrname = value loops!
self.__dict__[attr] = value
else:
print attr
raise AttributeError, attr + 'not allowed' X = accesscontrol()
X.age = 40 # call __setattr__
X.name = 'wang' # raise exception

python 基础——运算符重载的更多相关文章

  1. Python学习 之三 Python基础&运算符

    第三章:Python基础 & 运算符 3.1 内容回顾 & 补充 计算机基础 编码 字符串: "中国" "Hello" 字 符: 中 e 字 节 ...

  2. C++基础——运算符重载友元函数示例

    一.前言 其实本人学习C++的目的,只是为了体会OOP设计思想,并为利用System Verilog验证复杂设计做准备.如果想要真正做点软件方面项目级的东西,还需要掌握其他高级语言和库.框架等知识.因 ...

  3. 分分钟钟学会Python -基础&运算符

    day002 基础&运算符 1.循环语句 ### 1.循环格式 while 条件: print('') ''' while True: print('人生苦短,我用Python.') ''' ...

  4. Python基础运算符(算数、比较、赋值、逻辑、成员)

    Python运算符有(算数运算符.比较运算符.赋值运算符.逻辑运算符.位运算符.成员运算符.身份运算符): 本程序包含算数.比较.赋值.逻辑.成员运算符. 1.运算符测试 #!/usr/bin/pyt ...

  5. Python基础------运算符

    运算符类型 算数运算符 +   加               -    减              *    乘              /    除              %取余     ...

  6. python-运算符重载

    1. __item__ class X: def __init__(self, data=None): self.data = data or [] # 同样可用于 dict def __setite ...

  7. Python 中的运算符重载

    本文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,如有问题请及时联系我们以作处理 一种运算符对于不同类型的对象,有不同的使用方式.例如, + 用于整型对象,表示两个数相加:用于字符串 ...

  8. python运算符重载(二)

    一.基础知识 定义:当类中提供了某个特殊名称的方法,在该类的实例出现在它们相关的表达式时,Python自动调用它们 特性: 1.运算符重载让类拦截常规的Python运算. 2.类可重载所有Python ...

  9. python运算符重载

    python运算符重载就是在解释器使用对象内置操作前,拦截该操作,使用自己写的重载方法. 重载方法:__init__为构造函数,__sub__为减法表达式 class Number: def __in ...

随机推荐

  1. 汇编语言程序入门实验一:在dos下对用户输入作出应答

    汇编语言程序入门实验一:在dos下对用户输入作出应答 1,背景 成功预言了今天要上计算机操作系统上机实验课,昨天预习后,今天的两个上机实验做得很成功.但是也有一些问题.问题1:学校的系统目前是wind ...

  2. Custom ReadOnlyProperty【PluraSight】

    Limited functionality: Not settable No data binding No validation No animation No Inheritance When t ...

  3. AS与JS相互通信(Flex中调用js函数)

    转载自http://www.blogjava.net/Alpha/archive/2009/06/27/284373.html Flex中As调用Js的方法是:     1.导入包 (import f ...

  4. On-board diagnostics -- Standards documents

    http://en.wikipedia.org/wiki/On-board_diagnostics#Standards_documents SAE standards documents on OBD ...

  5. 【转】linux下awk内置函数的使用(split/substr/length)

    转自:http://gdcsy.blog.163.com/blog/static/12734360920130241521280/ 一.split 初始化和类型强制        awk的内建函数sp ...

  6. HDU 4876 ZCC loves cards(暴力剪枝)

    HDU 4876 ZCC loves cards 题目链接 题意:给定一些卡片,每一个卡片上有数字,如今选k个卡片,绕成一个环,每次能够再这个环上连续选1 - k张卡片,得到他们的异或和的数,给定一个 ...

  7. Microsoft Robotics Developer Studio 4

    Microsoft Robotics Developer Studio 4       Share   Language: English   Download Microsoft® Robotics ...

  8. centos 安装git server

    1.yum install lrzsz wget git 2.安装gitosis:gitosis为Git用户权限管理系统,通过管理服务端的/home/git/.ssh/authorized_key文件 ...

  9. 用Systemtap探索MySQL

    http://www.actionsky.com/docs/archives/168#Systemtap 目录 1 Systemtap 2 Systemtap 观测点的支持程度 2.1 官方编译的My ...

  10. oracle建索引的可选项

    oracle中建索引可能大家都会,但是建索引是有几个选项参数却很少有人关注,在某些特殊环境下,可能会非常有用,下面一一说明: 1.NOSORT,记录排序可选项. 默认情况下,在表中创建索引的时候,会对 ...