免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 3372 | 回复: 0
打印 上一主题 下一主题

Python运算符重载 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2009-10-16 10:17 |只看该作者 |倒序浏览

2009年08月13日 星期四 06:48 P.M.
运算符重载
在Python语言中提供了类似于C++的运算符重在功能:
一下为Python运算符重在调用的方法如下:
Method        Overloads        Call for
__init__        构造函数        X=Class()
__del__        析构函数        对象销毁
__add__        +                X+Y,X+=Y
__or__        |                X|Y,X|=Y
__repr__        打印转换        print X,repr(X)
__str__        打印转换        print X,str(X)
__call__        调用函数        X()
__getattr_    限制            X.undefine
__setattr__    取值            X.any=value
__getitem__    索引            X[key],
                            For If
__len__        长度            len(X)
__cmp__        比较            X==Y,X
Python代码
[/url]
  • class Number:   
  •     def __init__(self, start):   
  •         self.data = start   
  •     def __sub__(self, other): #minus method    
  •         return Number(self.data - other)   
  •    
  • number = Number(20)   
  • y = number – 10 # invoke __sub__ method   class Number:
        def __init__(self, start):
            self.data = start
        def __sub__(self, other): #minus method
            return Number(self.data - other)
    number = Number(20)
    y = number – 10 # invoke __sub__ method
    7.2    迭代重载
    Python代码
    [url=http://wangtong40.javaeye.com/blog/369429#]

  • class indexer:   
  •     def __getitem__(self, index): #iter override    
  •         return index ** 2   
  • X = indexer()   
  • X[2]   
  • for i in range(5):   
  •     print X   class indexer:
        def __getitem__(self, index): #iter override
            return index ** 2
    X = indexer()
    X[2]
    for i in range(5):
        print X
    7.3    索引重载
    Python代码
    [/url]
  • class stepper:   
  •     def __getitem__(self, i):   
  •         return self.data   
  •       
  • X = stepper()   
  • X.data = 'Spam'   
  • X[1] #call __getitem__    
  •    
  • for item in X: #call __getitem__    
  •     print item   class stepper:
        def __getitem__(self, i):
            return self.data
       
    X = stepper()
    X.data = 'Spam'
    X[1] #call __getitem__
    for item in X: #call __getitem__
         print item
    7.4    getAttr/setAttr重载
    Python代码
    [url=http://wangtong40.javaeye.com/blog/369429#]

  • class empty:   
  •     def __getattr__(self,attrname):   
  •         if attrname == 'age':   
  •             return 40   
  •         else:   
  •             raise AttributeError,attrname   
  • X = empty()   
  • print X.age #call__getattr__    
  •    
  • class accesscontrol:   
  •     def __setattr__(self, attr, value):   
  •         if attr == 'age':   
  •             # Self.attrname = value loops!    
  •             self.__dict__[attr] = value   
  •         else:   
  •             print attr   
  •             raise AttributeError, attr + 'not allowed'   
  •    
  • X = accesscontrol()   
  • X.age = 40      #call __setattr__    
  • X.name = 'wang' #raise exception   class empty:
        def __getattr__(self,attrname):
            if attrname == 'age':
                return 40
            else:
                raise AttributeError,attrname
    X = empty()
    print X.age #call__getattr__
    class accesscontrol:
        def __setattr__(self, attr, value):
            if attr == 'age':
                # Self.attrname = value loops!
                self.__dict__[attr] = value
            else:
                print attr
                raise AttributeError, attr + 'not allowed'
    X = accesscontrol()
    X.age = 40      #call __setattr__
    X.name = 'wang' #raise exception
    7.5    打印重载
    Python代码
    [/url]
  • class adder:   
  •     def __init__(self, value=0):   
  •         self.data = value   
  •     def __add__(self, other):   
  •         self.data += other   
  •    
  • class addrepr(adder):   
  •     def __repr__(self):   
  •         return 'addrepr(%s)' % self.data   
  •       
  • x = addrepr(2)  #run __init__    
  • x + 1       #run __add__    
  • print x     #run __repr__   class adder:
        def __init__(self, value=0):
            self.data = value
        def __add__(self, other):
            self.data += other
    class addrepr(adder):
        def __repr__(self):
            return 'addrepr(%s)' % self.data
       
    x = addrepr(2)  #run __init__
    x + 1       #run __add__
    print x     #run __repr__
    7.6    Call调用函数重载
    Python代码
    [url=http://wangtong40.javaeye.com/blog/369429#]

  • class Prod:   
  •     def __init__(self, value):   
  •         self.value = value   
  •     def __call__(self, other):   
  •         return self.value * other   
  •    
  • p = Prod(2) #call __init__    
  • print p(1) #call __call__    
  • print p(2)   class Prod:
        def __init__(self, value):
            self.value = value
        def __call__(self, other):
            return self.value * other
    p = Prod(2) #call __init__
    print p(1) #call __call__
    print p(2)
    7.7    析构函数重载
    Python代码
    [/url]
  • class Life:   
  •     def __init__(self, name='name'):   
  •         print 'Hello', name   
  •         self.name = name   
  •     def __del__(self):   
  •         print 'Goodby', self.name   
  •    
  • brain = Life('Brain') #call __init__    
  • brain = 'loretta'    # call __del__   

    本文来自ChinaUnix博客,如果查看原文请点:[url]http://blog.chinaunix.net/u1/59571/showart_2071511.html
  • 您需要登录后才可以回帖 登录 | 注册

    本版积分规则 发表回复

      

    北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
    未成年举报专区
    中国互联网协会会员  联系我们:huangweiwei@itpub.net
    感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

    清除 Cookies - ChinaUnix - Archiver - WAP - TOP