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、付费专栏及课程。

余额充值