[转载] 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

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容