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中让MySQL查询结果返回字典类型的方法
Aug 22 Python
在Django的URLconf中使用多个视图前缀的方法
Jul 18 Python
浅谈Django中的数据库模型类-models.py(一对一的关系)
May 30 Python
python 列表降维的实例讲解
Jun 28 Python
win10下python3.5.2和tensorflow安装环境搭建教程
Sep 19 Python
对python3中, print横向输出的方法详解
Jan 28 Python
Python实现定制自动化业务流量报表周报功能【XlsxWriter模块】
Mar 11 Python
Django 权限认证(根据不同的用户,设置不同的显示和访问权限)
Jul 24 Python
Python 脚本拉取 Docker 镜像问题
Nov 10 Python
pycharm无法导入本地模块的解决方式
Feb 12 Python
如何用python处理excel表格
Jun 09 Python
python + selenium 刷B站播放量的实例代码
Jun 12 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 addslashes和mysql_real_escape_string
2010/01/24 PHP
php 数组排序 array_multisort与uasort的区别
2011/03/24 PHP
php将数组转换成csv格式文件输出的方法
2015/03/14 PHP
php实现简单爬虫的开发
2016/03/28 PHP
php 替换文章中的图片路径,下载图片到本地服务器的方法
2018/02/06 PHP
ThinkPHP防止重复提交表单的方法实例分析
2018/05/10 PHP
php输出控制函数和输出函数生成静态页面
2019/06/27 PHP
jquery.boxy插件的iframe扩展代码
2010/07/02 Javascript
解析JavaScript中delete操作符不能删除的对象
2013/12/03 Javascript
JavaScript合并两个数组并去除重复项的方法
2015/06/13 Javascript
谈谈我对JavaScript原型和闭包系列理解(随手笔记9)
2015/12/24 Javascript
神奇!js+CSS+DIV实现文字颜色渐变效果
2016/03/16 Javascript
原生js验证简洁注册登录页面
2016/12/17 Javascript
微信小程序 PHP后端form表单提交实例详解
2017/01/12 Javascript
js使用highlight.js高亮你的代码
2017/08/18 Javascript
详解vue mint-ui源码解析之loadmore组件
2017/10/11 Javascript
Node.js学习教程之HTTP/2服务器推送【译】
2017/10/31 Javascript
微信小程序实现image组件图片自适应宽度比例显示的方法
2018/01/16 Javascript
微信小程序实现天气预报功能
2018/07/18 Javascript
详解vue使用插槽分发内容slot的用法
2019/03/28 Javascript
vue实现select下拉显示隐藏功能
2019/09/30 Javascript
vue keep-alive列表页缓存 详情页返回上一页不刷新,定位到之前位置
2019/11/26 Javascript
[06:40]2014DOTA2西雅图国际邀请赛 DK战队巡礼
2014/07/07 DOTA
Python中is与==判断的区别
2017/03/28 Python
Python调用adb命令实现对多台设备同时进行reboot的方法
2018/10/15 Python
python实现的读取网页并分词功能示例
2019/10/29 Python
Python GUI编程学习笔记之tkinter事件绑定操作详解
2020/03/30 Python
Tory Burch英国官方网站:美国时尚生活品牌
2017/12/06 全球购物
世界顶级俱乐部的官方球衣和套装:Subside Sports
2018/04/22 全球购物
Sneaker Studio法国:购买运动鞋
2018/06/08 全球购物
青年志愿者活动方案
2014/08/17 职场文书
保卫工作个人总结
2015/03/03 职场文书
2016年领导干部廉政承诺书
2016/03/24 职场文书
Python OpenCV快速入门教程
2021/04/17 Python
详解MySQL事务的隔离级别与MVCC
2021/04/22 MySQL
pyqt5打包成exe可执行文件的方法
2021/05/14 Python