python 运算符重载有什么用_[转载] Python-运算符重载

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值