本文实例讲述了Python运算符重载用法。分享给大家供大家参考。具体如下:
在Python语言中提供了类似于C++的运算符重在功能:
一下为Python运算符重在调用的方法如下:
Method Overloads Call for
__init__ 构造函数 X=Class()
__del__ 析构函数 对象销毁
__add__ + X+Y,X+=Y
__or__ | X|Y,X|=Y
__repr__ 打印转换 print X,repr(X)
__str__ 打印转换 print X,str(X)
__call__ 调用函数 X()
__getattr_ 限制 X.undefine
__setattr__ 取值 X.any=value
__getitem__ 索引 X[key],
__len__ 长度 len(X)
__cmp__ 比较 X==Y,X<Y
__lt__ 小于 X<Y
__eq__ 等于 X=Y
__radd__ Right-Side + +X
__iadd__ += X+=Y
__iter__ 迭代 For In
1. 减法重载
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
class Number:
def __init__( self , start):
self .data = start
def __sub__( self , other): #minus method
return Number( self .data - other)
number = Number( 20 )
y = number – 10 # invoke __sub__ method
class Number:
def __init__( self , start):
self .data = start
def __sub__( self , other): #minus method
return Number( self .data - other)
number = Number( 20 )
y = number – 10 # invoke __sub__ method
|
2. 迭代重载
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
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 __getitem__( self , index): #iter override
return index * * 2
X = indexer()
X[ 2 ]
for i in range ( 5 ):
print X[i]
|
3. 索引重载
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
class stepper:
def __getitem__( self , i):
return self .data[i]
X = stepper()
X.data = 'Spam'
X[ 1 ] #call __getitem__
for item in X: #call __getitem__
print item
class stepper:
def __getitem__( self , i):
return self .data[i]
X = stepper()
X.data = 'Spam'
X[ 1 ] #call __getitem__
for item in X: #call __getitem__
print item
|
4. getAttr/setAttr重载
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
|
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
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
|
5. 打印重载
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
|
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(%s)' % self .data
x = addrepr( 2 ) #run __init__
x + 1 #run __add__
print x #run __repr__
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(%s)' % self .data
x = addrepr( 2 ) #run __init__
x + 1 #run __add__
print x #run __repr__
|
6. Call调用函数重载
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
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 )
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 )
|
7. 析构函数重载
1
2
3
4
5
6
7
8
|
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__
|
希望本文所述对大家的Python程序设计有所帮助。