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中static相关知识小结
Jan 02 Python
Python爬虫框架scrapy实现downloader_middleware设置proxy代理功能示例
Aug 04 Python
Selenium鼠标与键盘事件常用操作方法示例
Aug 13 Python
pygame游戏之旅 添加游戏界面按键图形
Nov 20 Python
linux下python中文乱码解决方案详解
Aug 28 Python
关于django 1.10 CSRF验证失败的解决方法
Aug 31 Python
基于python的docx模块处理word和WPS的docx格式文件方式
Feb 13 Python
浅谈OpenCV中的新函数connectedComponentsWithStats用法
Jul 05 Python
使用Python项目生成所有依赖包的清单方式
Jul 13 Python
selenium如何定位span元素的实现
Jan 13 Python
python实现简单的井字棋
May 26 Python
Python实现仓库管理系统
May 30 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 无限极分类
2008/03/27 PHP
yii2 数据库读写分离配置示例
2017/02/10 PHP
laravel框架实现为 Blade 模板引擎添加新文件扩展名操作示例
2020/01/25 PHP
Jquery中使用setInterval和setTimeout的方法
2013/04/08 Javascript
两个数组去重的JS代码
2013/12/04 Javascript
jQuery拖拽div实现思路
2014/02/19 Javascript
jQuery中change事件用法实例
2014/12/26 Javascript
PHP+mysql+Highcharts生成饼状图
2015/05/04 Javascript
js获取html的span标签的值方法(超简单)
2016/07/26 Javascript
关于数据与后端进行交流匹配(点亮星星)
2016/08/03 Javascript
Angular4学习笔记之实现绑定和分包
2017/08/01 Javascript
webpack构建换肤功能的思路详解
2017/11/27 Javascript
layui结合form,table的全选、反选v1.0示例讲解
2018/08/15 Javascript
vuejs实现折叠面板展开收缩动画效果
2018/09/06 Javascript
JavaScript基础教程之如何实现一个简单的promise
2018/09/11 Javascript
JQuery事件委托原理与用法实例分析
2019/05/13 jQuery
vue前后分离调起微信支付
2019/07/29 Javascript
在elementui中Notification组件添加点击事件实例
2020/11/11 Javascript
Python+Django在windows下的开发环境配置图解
2009/11/11 Python
python生成ppt的方法
2018/06/07 Python
python django生成迁移文件的实例
2019/08/31 Python
pytorch 归一化与反归一化实例
2019/12/31 Python
解决tensorflow添加ptb库的问题
2020/02/10 Python
python MultipartEncoder传输zip文件实例
2020/04/07 Python
10个最常见的HTML5面试题 附答案
2016/06/06 HTML / CSS
来自世界各地的优质葡萄酒:VineShop24
2018/07/09 全球购物
Kiwi.com中国:找到特价机票并发现新目的地
2019/10/27 全球购物
哪些情况下不应该使用索引
2015/07/20 面试题
工商管理专业应届生求职信
2013/11/04 职场文书
幼儿园师德演讲稿
2014/05/06 职场文书
人事专员岗位职责说明书
2014/07/30 职场文书
《微笑着面对生活》优秀演讲稿范文
2014/09/23 职场文书
学校教师师德师风承诺书
2015/04/28 职场文书
2015年思想品德教学工作总结
2015/07/22 职场文书
教你使用TensorFlow2识别验证码
2021/06/11 Python
JAVA API 实用类 String详解
2021/10/05 Java/Android