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实现无证书加密解密实例
Oct 27 Python
使用优化器来提升Python程序的执行效率的教程
Apr 02 Python
Python 26进制计算实现方法
May 28 Python
在Python中的Django框架中进行字符串翻译
Jul 27 Python
Python argv用法详解
Jan 08 Python
Python实现按照指定要求逆序输出一个数字的方法
Apr 19 Python
对tensorflow 的模型保存和调用实例讲解
Jul 28 Python
python3 property装饰器实现原理与用法示例
May 15 Python
python 通过视频url获取视频的宽高方式
Dec 10 Python
浅谈Python访问MySQL的正确姿势
Jan 07 Python
Jupyter notebook命令和编辑模式常用快捷键汇总
Nov 17 Python
详解Python+OpenCV进行基础的图像操作
Feb 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 iconv 函数转gb2312的bug解决方法
2009/10/11 PHP
php学习之 循环结构实现代码
2011/06/09 PHP
php出现内存位置访问无效错误问题解决方法
2014/08/16 PHP
PHP数组排序之sort、asort与ksort用法实例
2014/09/08 PHP
JavaScript实现Sleep函数的代码
2007/03/04 Javascript
JavaScript 类似flash效果的立体图片浏览器
2010/02/08 Javascript
js+数组实现网页上显示时间/星期几的实用方法
2013/01/18 Javascript
JavaScript加强之自定义callback示例
2013/09/21 Javascript
jquery渐隐渐显的图片幻灯闪烁切换实现方法
2015/02/26 Javascript
jQuery实现返回顶部效果的方法
2015/05/29 Javascript
laydate.js日期时间选择插件
2017/01/04 Javascript
bootstrap实现动态进度条效果
2017/03/08 Javascript
微信小程序出现wx.navigateTo页面不跳转问题的解决方法
2017/12/26 Javascript
laydate时间日历插件使用方法详解
2018/11/14 Javascript
python 正则式 概述及常用字符
2009/05/07 Python
Python中实现对list做减法操作介绍
2015/01/09 Python
python以环状形式组合排列图片并输出的方法
2015/03/17 Python
Django 添加静态文件的两种实现方法(必看篇)
2017/07/14 Python
Python OpenCV获取视频的方法
2018/02/28 Python
Django自定义过滤器定义与用法示例
2018/03/22 Python
Python时间和字符串转换操作实例分析
2019/03/16 Python
简单了解Java Netty Reactor三种线程模型
2020/04/26 Python
新版Pycharm中Matplotlib不会弹出独立的显示窗口的问题
2020/06/02 Python
python生成word合同的实例方法
2021/01/12 Python
CSS3对图片照片进行边缘模糊处理的实现
2018/08/08 HTML / CSS
HTML5 localStorage使用总结
2017/02/22 HTML / CSS
简述Linux文件系统通过i节点把文件的逻辑结构和物理结构转换的工作过程
2012/04/17 面试题
斯福泰克软件测试面试题
2015/02/16 面试题
YII2 全局异常处理深入讲解
2021/03/24 PHP
霸王洗发水广告词
2014/03/14 职场文书
见习报告的格式
2014/11/04 职场文书
2014年政协工作总结
2014/12/09 职场文书
2015年简历自我评价范文
2015/03/11 职场文书
2015年政协委员工作总结
2015/05/20 职场文书
python自动统计zabbix系统监控覆盖率的示例代码
2021/04/03 Python
MySQL之select、distinct、limit的使用
2021/11/11 MySQL