python 基础——运算符重载

方法

重载

调用

__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  

 

posted @ 2016-08-24 21:43  弋痕夕的残影  阅读(743)  评论(0编辑  收藏  举报