Python-运算符重载
本博客用于记录学习Python的运算符重载,欢迎学习交流!
常见的运算符重载方法:
__getitem__拦截索引运算
__getitem__和__iter__实现迭代
用户定义的迭代器
__getattr__和__setattr__捕捉属性的引用
模拟实例的私有性
__repr__和__str__会返回字符串表达形式
__radd__处理右侧加法
__call__拦截调用
__dell__是析构器
sub
class Number:
def __init__(self,start): #构造器方法
self.data = start
def __sub__(self,other):
return Number(self.data - 2*other)
x = Number(5)
print x.data
y = x-1
print y.data
getitem (拦截索引运算)
如果在类中定义的话,则对于实例的索引运算,会自动调用getitem。当实例X出现X[i]这样的索引运算时,Python会自动调用getitem方法
class Indexer(object):
def __getitem__(self,index):
return index ** 6
X = Indexer()
print X[2]
iter实现迭代
class SkipInterator:
def __init__(self,wrapped):
self.wrapped = wrapped
self.offset = 0
def next(self): #重写next()方法
if self.offset >= len(self.wrapped):
raise StopIteration
else:
item = self.wrapped[self.offset]
self.offset +=2
return item
class SkipObject:
def __init__(self,wrapped):
self.wrapped = wrapped
def __iter__(self):
return SkipInterator(self.wrapped)
if __name__=='__main__':
alpha = 'abcdef'
Skipper=SkipObject(alpha)
I = iter(Skipper)
print I.next(),I.next(),I.next()
for x in Skipper:
for y in Skipper:
print x+y,
getattr和setattr
# getattr 拦截属性运算
class person:
def __getattr__(self,attrname):
if attrname=='age':
return 40
else:
raise AttributeError,attrname
x =person()
print x.age
setattr
#setattr 拦截赋值运算
class accessControl:
def __setattr__(self,attr,value):
if attr=='age':
self.__dict__[attr]=value
else:
raise AttributeError,attr+'not allowed'
c = accessControl()
c.age=34
print c.age
call 拦截调用
class Prod:
def __init__(self,value):
self.value = value
def __call__(self,other):
return self.value*other
x = Prod(2)
print x(3)
def 析构器
实例不用的时候自动执行
class Life:
def __init__(self,name = 'unknown'):
print 'Hello',name
self.name = name
def __del__(self):
print 'Goodbye',self.name
brian =Life()
brian = 'abc'
输出如下所示:
Hello unknown Goodbye unknown