# This program demos overloading operator and some builtin function's hook。It can be used as a tutorial. 
# If you find any problem, please tell me.
# author: Simeon Chaos simeon.chaos@gmail.com
# version 0.1.0 2007-6-24
# license: In public domain. You can freely use, modify, redistribute this file in any ways. Keep the text about the author is appreciated.
# Warranty: THERE IS NO ANY WARRANTY FOR THE PROGRAM. The software is provided "as-is," without any express or implied warranty. In no event shall the author be held liable for any damages arising from the use of the software.
# Tested at Windows, python 2.4.4

#from __future__ import division #when imported,__truediv__ is called, output is as below:
# op/1: __truediv__      1/op: __rtruediv__      op /= 1: __itruediv__
#else __div__ is called, output is as below:
# op/1: __div__      1/op: __rdiv__      op /= 1: __idiv__

# Chinese
# 本程序演示重载操作符和某些内置函数的钩子,用于学习和演示。
# 如果有任何问题,请告诉我。
# 作者: 曹星明 simeon.chaos@gmail.com
# 版本 0.1.0 2007-6-24
# 使用证书:公用许可。允许以任何方式自由使用,修改,分发本文件。欢迎保留这些关于作者的文字。
# 免责声明:作者对本文件的使用不作任何担保。
# 在Windows, python 2.4.4上运行通过。

#from __future__ import division #如果导入,将调用__truediv__,因此将有如下输出
# op/1: __truediv__      1/op: __rtruediv__      op /= 1: __itruediv__
#否则,将调用__div__,因此将有如下输出
# op/1: __div__      1/op: __rdiv__      op /= 1: __idiv__

#result(run on Windows, python 2.4.4, boa constructor 0.4.4)
'''
op.__doc__: Operation  __doc__
Demo the relation between some operators / builtin function and their hook method.
演示各种操作符以及内建函数与钩子函数之间的对应关系
op+1: __add__      1+op: __radd__      op += 1: __iadd__
op-1: __sub__      1-op: __rsub__      op -= 1: __isub__
op*1: __mul__      1*op: __rmul__      op *= 1: __imul__
op/1: __div__      1/op: __rdiv__      op /= 1: __idiv__
op%1: __xmod__      1%op: __rmod__      op %= 1: __imod__
op//1: __floordiv__      1//op: __rfloordiv__      op //= 1: __ifloordiv__
op^1: __xor__      1^op: __rxor__      op ^= 1: __ixor__
~op: __invert__
-op: __neg__
+op: __pos__
abs(op): __abs__
op==1: __eq__       1==op: __eq__
op!=1: __ne__       1!=op: __ne__
op<1: __lt__       1<op: __gt__
op<=1: __le__       1<=op: __ge__
op>=1: __ge__       1>=op: __le__
op>1: __gt__       1>op: __lt__
cmp(op,1): __eq__ __lt__ __gt__ __cmp__       cmp(1,op): __eq__ __gt__ __lt__ __cmp__
op>=1: __ge__       1>=op: __le__
divmod(op,1): __divmod__      divmod(1,op): __rdivmod__
pow(op,1): __pow__      pow(1,op): __rpow__
int(op): __int__
long(op): __long__
float(op): __float__
oct(op): __oct__
hex(op): __hex__
op or 1: __nonzero__
op(): __call__
op[1]=1 __setitem__
op[1] __getitem__
op[:]=[] __setslice__
op[:] __getslice__
del op[:] __delslice__
1 in op __contains__
[x for x in op] __iter__
op.a: __getattr__
op.a = 1: __setattr__
op.a:
del op.a: __delattr__

len(op) __len__
str(op) __str__
repr(op) __repr__

coerce(op,1): __coerce__ number coercion failed
op+1: __coerce__
'''

class Operation:
  '''Operation  __doc__
Demo the relation between some operators / builtin function and their hook method.
演示各种操作符以及内建函数与钩子函数之间的对应关系'''
  def __add__(self, other): print '__add__',
  def __radd__(self, other): print '__radd__',
  def __iadd__(self, other): print '__iadd__',; return self 

  def __sub__(self, other): print '__sub__',
  def __rsub__(self, other): print '__rsub__',
  def __isub__(self, other): print '__isub__',; return self 

  def __mul__(self, other): print '__mul__',
  def __rmul__(self, other): print '__rmul__',
  def __imul__(self, other): print '__imul__',; return self 

  def __div__(self, other): print '__div__',
  def __rdiv__(self, other): print '__rdiv__',
  def __idiv__(self, other): print '__idiv__',; return self 

  def __xor__(self, other): print '__xor__',
  def __rxor__(self, other): print '__rxor__',
  def __ixor__(self, other): print '__ixor__',; return self 

  def __mod__(self, other): print '__xmod__',
  def __rmod__(self, other): print '__rmod__',
  def __imod__(self, other): print '__imod__',; return self 

  def __floordiv__(self, other): print '__floordiv__',
  def __rfloordiv__(self, other): print '__rfloordiv__',
  def __ifloordiv__(self, other): print '__ifloordiv__',; return self 

  def __truediv__(self, other): print '__truediv__',
  def __rtruediv__(self, other): print '__rtruediv__',
  def __itruediv__(self, other): print '__itruediv__',; return self 

  def __or__(self, other): print '__or__',
  def __ror__(self, other): print '__ror__',
  def __ior__(self, other): print '__ior__',; return self 

  def __and__(self, other): print '__and__',
  def __rand__(self, other): print '__rand__',
  def __iand__(self, other): print '__iand__',; return self 

  def __lshift__(self, other): print '__lshift__',
  def __rlshift__(self, other): print '__rlshift__',
  def __ilshift__(self, other): print '__ilshift__',; return self 

  def __rshift__(self, other): print '__rshift__',
  def __rrlshift__(self, other): print '__rrshift__',
  def __irlshift__(self, other): print '__irshift__',; return self 

  def __invert__(self): print '__invert__'; return 0
  def __neg__(self): print '__neg__'; return -1
  def __pos__(self): print '__pos__'; return +1

  def __divmod__(self, other): print '__divmod__',
  def __rdivmod__(self, other): print '__rdivmod__',

  def __pow__(self, other): print '__pow__',
  def __rpow__(self, other): print '__rpow__',

  def __abs__(self): print '__abs__',
  def __nonzero__(self): print '__nonzero__'; return True
  
  def __call__(self): print '__call__',;

  def __eq__(self, other): print '__eq__',; return 0
  def __ne__(self, other): print '__ne__',; return 0
  def __lt__(self, other): print '__lt__',; return 0
  def __le__(self, other): print '__le__',; return 0
  def __ge__(self, other): print '__ge__',; return 0
  def __gt__(self, other): print '__gt__',; return 0
  def __cmp__(self, other): print '__cmp__',; return 0
  
  def __coerce__(self, other): return None
  
  def __getitem__(self, i): print '__getitem__'; return None
  def __setitem__(self, i, value): print '__setitem__'; return self

  def __getslice__( self, i, j): print '__getslice__'; return self
    #Deprecated since release 2.0. Support slice objects as parameters to the __getitem__() method.

  def __setslice__( self, i, j, sequence): print '__setslice__'; return self 
    #This method is deprecated. 

  def __delslice__( self, i, j): print '__delslice__'  
  def __contains__( self, item): print '__contains__' 
  def __iter__( self): print '__iter__'; return iter([]) 
 

  def __getattribute__(self, attr): print '__getattribute__'; return None
  #def __setattribute__(self, attr, value): print '__setattribute__'; self.__dict__[attr] = value; return None
  #__setattribute__只对new style class起作用
  def __getattr__(self, attr): print '__getattr__',; return None
  def __setattr__(self, attr, value): print '__setattr__'; self.__dict__[attr] = value; return None
  def __delattr__(self, attr): print '__delattr__'; return None
  
  def __float__(self): print '__float__'; return 0.0
  def __int__(self): print '__int__'; return 0
  def __long__(self): print '__long__'; return 0
  def __oct__(self): print '__oct__'; return '12'
  def __hex__(self): print '__hex__'; return '0xf5'
  def __len__(self): print '__len__'; return 0
  def __repr__(self): print '__repr__'; return ''
  def __str__(self): print '__str__'; return ''
  

op = Operation()
print 'op.__doc__:', op.__doc__

print 'op+1:',; op+1; print '     1+op:',; 1+op; print '     op += 1:',; op += 1; print
print 'op-1:',; op-1; print '     1-op:',; 1-op; print '     op -= 1:',; op -= 1; print
print 'op*1:',; op*1; print '     1*op:',; 1*op; print '     op *= 1:',; op *= 1; print
print 'op/1:',; op/1; print '     1/op:',; 1/op; print '     op /= 1:',; op /= 1; print
print 'op%1:',; op%1; print '     1%op:',; 1%op; print '     op %= 1:',; op %= 1; print
print 'op//1:',; op//op; print '     1//op:',; 1//op; print '     op //= 1:',; op //= 1; print
print 'op^1:',; op^1; print '     1^op:',; 1^op; print '     op ^= 1:',; op ^= 1; print

print '~op:',; ~op
print '-op:',; -op
print '+op:',; +op

print 'abs(op):',; abs(op);print
print 'op==1:',; op==1; print '      1==op:',; 1==op; print
print 'op!=1:',; op!=1; print '      1!=op:',; 1!=op; print
print 'op<1:',; op<1; print '      1<op:',; 1<op; print
print 'op<=1:',; op<=1; print '      1<=op:',; 1<=op; print
print 'op>=1:',; op>=1; print '      1>=op:',; 1>=op; print
print 'op>1:',; op>1; print '      1>op:',; 1>op; print
print 'cmp(op,1):',; cmp(op,1); print '      cmp(1,op):',; cmp(1,op);print
print 'op>=1:',; op>=1; print '      1>=op:',; 1>=op;print
print 'divmod(op,1):',;divmod(op,1);print '     divmod(1,op):',; divmod(1,op); print 
print 'pow(op,1):',;pow(op,1);print '     pow(1,op):',; pow(1,op); print 


print 'int(op):',; int(op)
print 'long(op):',; long(op)
print 'float(op):',; float(op)
print 'oct(op):',; oct(op)
print 'hex(op):',; hex(op)

print 'op or 1:',; op or 1
print 'op():',; op(); print

print 'op[1]=1',; op[1]=1
print 'op[1]',; op[1]
print 'op[:]=[]',; op[:]=[]
print 'op[:]',; op[:]
print 'del op[:]',; del op[:]
print '1 in op',; 1 in op
print '[x for x in op]',;[x for x in op]
print 'op.a:',; op.a; print
print 'op.a = 1:',; op.a = 1
print 'op.a:',; op.a; print
print 'del op.a:',; del op.a; print
print 'len(op)',; len(op);
print 'str(op)',; str(op)
print 'repr(op)', repr(op)
 
class Operation:
  '''complement:If __coerce__ is put above, it is disturbed to run the other method, 
so __coerce__ is put here alone. You can try it yourself.
补充:因为__coerce__放在上面的类定义中将干扰其它方法的执行,因此单独列出。读者可以自己试一下。'''
  def __add__(self, other): pass
  def __coerce__(self, other): print '__coerce__',; return None

op = Operation()
try: print 'coerce(op,1):',; coerce(op,1); 
except TypeError, e: print e
try: print 'op+1:',; op+1; 
except TypeError, e: print e

OperatorHook (last edited 2013-10-06 13:04:43 by PaulBoddie)

Unable to edit the page? See the FrontPage for instructions.