Python运算符重载用法实例分析


Posted in Python onJune 01, 2015

本文实例讲述了Python运算符重载用法。分享给大家供大家参考。具体如下:

在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],
__len__         长度             len(X)
__cmp__         比较             X==Y,X<Y
__lt__         小于             X<Y
__eq__         等于             X=Y
__radd__        Right-Side +         +X
__iadd__        +=                 X+=Y
__iter__        迭代             For In

1. 减法重载

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

2. 迭代重载

class indexer:  
  def __getitem__(self, index): #iter override  
    return index ** 2 
X = indexer()  
X[2]  
for i in range(5):  
  print X[i] 
class indexer: 
  def __getitem__(self, index): #iter override 
    return index ** 2 
X = indexer() 
X[2] 
for i in range(5): 
  print X[i]

3. 索引重载

class stepper:  
  def __getitem__(self, i):  
    return self.data[i]  
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[i] 
X = stepper() 
X.data = 'Spam' 
X[1] #call __getitem__ 
for item in X: #call __getitem__ 
   print item

4. getAttr/setAttr重载

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

5. 打印重载

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__

6. Call调用函数重载

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. 析构函数重载

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__

希望本文所述对大家的Python程序设计有所帮助。

Python 相关文章推荐
python生成指定长度的随机数密码
Jan 23 Python
python实现的文件夹清理程序分享
Nov 22 Python
python常见的格式化输出小结
Dec 15 Python
django数据库migrate失败的解决方法解析
Feb 08 Python
python爬虫超时的处理的实例
Dec 19 Python
Python实现查找最小的k个数示例【两种解法】
Jan 08 Python
python中字典按键或键值排序的实现代码
Aug 27 Python
python实现LRU热点缓存及原理
Oct 29 Python
Python 2种方法求某个范围内的所有素数(质数)
Jan 31 Python
Python 图片处理库exifread详解
Feb 25 Python
Python将CSV文件转化为HTML文件的操作方法
Jun 30 Python
Python编程中Python与GIL互斥锁关系作用分析
Sep 15 Python
python使用Image处理图片常用技巧分析
Jun 01 #Python
python实现图片变亮或者变暗的方法
Jun 01 #Python
wxPython中listbox用法实例详解
Jun 01 #Python
在Python的Django框架下使用django-tagging的教程
May 30 #Python
使用url_helper简化Python中Django框架的url配置教程
May 30 #Python
在Python的Django框架中simple-todo工具的简单使用
May 30 #Python
Python中Django框架下的staticfiles使用简介
May 30 #Python
You might like
PHP+DBM的同学录程序(5)
2006/10/09 PHP
php 友好URL的实现(吐血推荐)
2008/10/04 PHP
基于php无限分类的深入理解
2013/06/02 PHP
php去掉文件前几行的方法
2015/07/29 PHP
PHP SESSION机制的理解与实例
2019/03/22 PHP
jquery.ui.draggable中文文档
2009/11/24 Javascript
JavaScript中的集合及效率
2010/01/08 Javascript
JS特殊函数(Function()构造函数、函数直接量)区别介绍
2013/05/19 Javascript
JavaScript焦点事件、鼠标事件和滚轮事件使用详解
2016/01/15 Javascript
jQuery点击输入框显示验证码图片
2016/05/19 Javascript
老生常谈 js中this的指向
2016/06/30 Javascript
Bootstrap实现input控件失去焦点时验证
2016/08/04 Javascript
javascript编写简易计算器
2017/05/06 Javascript
AngularJS读取JSON及XML文件的方法示例
2017/05/25 Javascript
5分钟打造简易高效的webpack常用配置
2017/07/04 Javascript
vue使用监听实现全选反选功能
2018/07/06 Javascript
vue+axios实现文件下载及vue中使用axios的实例
2018/09/21 Javascript
Angular CLI 使用教程指南参考小结
2019/04/10 Javascript
JS把字符串格式的时间转换成几秒前、几分钟前、几小时前、几天前等格式
2019/07/10 Javascript
react实现同页面三级跳转路由布局
2019/09/26 Javascript
Vue学习之axios的使用方法实例分析
2020/01/06 Javascript
原生JS实现留言板功能
2020/02/08 Javascript
[01:00]选手抵达华西村 整装待发备战2016国际邀请赛中国区预选赛
2016/06/25 DOTA
深入讨论Python函数的参数的默认值所引发的问题的原因
2015/03/30 Python
Python二叉树定义与遍历方法实例分析
2018/05/25 Python
python多线程扫描端口(线程池)
2019/09/04 Python
浅谈keras 的抽象后端(from keras import backend as K)
2020/06/16 Python
瑞典快乐袜子:Happy Socks
2018/02/16 全球购物
公务员职务工作的自我评价
2013/11/01 职场文书
技术学校毕业生求职信分享
2013/12/02 职场文书
大学班级学风建设方案
2014/05/01 职场文书
大学计划书范文800字
2014/08/14 职场文书
2014年文明创建工作总结
2014/11/25 职场文书
2014年办公室人员工作总结
2014/12/09 职场文书
让文件路径提取变得更简单的Python Path库
2021/05/27 Python
关于nginx 实现jira反向代理的问题
2021/09/25 Servers