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生成日历实例解析
Aug 21 Python
Python实用日期时间处理方法汇总
May 09 Python
python anaconda 安装 环境变量 升级 以及特殊库安装的方法
Jun 21 Python
Win8下python3.5.1安装教程
Jul 29 Python
PyCharm配置mongo插件的方法
Nov 30 Python
对python中基于tcp协议的通信(数据传输)实例讲解
Jul 22 Python
tensorflow将图片保存为tfrecord和tfrecord的读取方式
Feb 17 Python
python 代码实现k-means聚类分析的思路(不使用现成聚类库)
Jun 01 Python
Keras官方中文文档:性能评估Metrices详解
Jun 15 Python
python 实现单例模式的5种方法
Sep 23 Python
python-opencv 中值滤波{cv2.medianBlur(src, ksize)}的用法
Jun 05 Python
python程序的组织结构详解
Dec 06 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
Yii中创建自己的Widget实例
2016/01/05 PHP
简单实现PHP留言板功能
2016/12/21 PHP
PHP基于DOM创建xml文档的方法示例
2017/02/08 PHP
javascript 放大镜效果js组件 qsoft.PopBigImage.v0.35 加入了chrome支持
2009/04/07 Javascript
js冒泡法和数组转换成字符串示例代码
2013/08/14 Javascript
Nodejs学习笔记之NET模块
2015/01/13 NodeJs
理解JS事件循环
2016/01/07 Javascript
jQuery检查元素存在性(推荐)
2016/09/17 Javascript
解析Angular 2+ 样式绑定方式
2018/01/15 Javascript
node实现爬虫的几种简易方式
2019/08/22 Javascript
从零搭一个自用的前端脚手架的方法步骤
2019/09/23 Javascript
Jquery如何使用animation动画效果改变背景色的代码
2020/07/20 jQuery
[56:46]Liquid vs IG 2018国际邀请赛小组赛BO2 第二场 8.17
2018/08/18 DOTA
[02:36]DOTA2-DPC中国联赛 正赛 PSG.LGD vs Magma 选手采访
2021/03/11 DOTA
Python常见文件操作的函数示例代码
2011/11/15 Python
使用Python的内建模块collections的教程
2015/04/28 Python
Python之web模板应用
2017/12/26 Python
Python实现的求解最大公约数算法示例
2018/05/03 Python
Python多进程池 multiprocessing Pool用法示例
2018/09/07 Python
CentOS下Python3的安装及创建虚拟环境的方法
2018/11/28 Python
Python数学形态学实例分析
2019/09/06 Python
Pandas 解决dataframe的一列进行向下顺移问题
2019/12/27 Python
Keras 加载已经训练好的模型进行预测操作
2020/06/17 Python
Django Admin后台模型列表页面如何添加自定义操作按钮
2020/11/11 Python
Python就将所有的英文单词首字母变成大写
2021/02/12 Python
Android面试题及答案
2015/09/04 面试题
美工的岗位职责
2013/11/14 职场文书
电钳专业个人求职信
2014/01/04 职场文书
应聘编辑职位自荐信范文
2014/01/05 职场文书
户籍证明格式
2014/09/15 职场文书
环卫处个人工作总结
2015/03/04 职场文书
开业庆典嘉宾致辞
2015/08/01 职场文书
初中物理教学反思
2016/02/19 职场文书
经典法律座右铭(50句)
2019/08/15 职场文书
面试中老生常谈的MySQL问答集锦夯实基础
2022/03/13 MySQL
Java实现扫雷游戏详细代码讲解
2022/05/25 Java/Android