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 相关文章推荐
9种python web 程序的部署方式小结
Jun 30 Python
零基础写python爬虫之爬虫框架Scrapy安装配置
Nov 06 Python
Python遍历pandas数据方法总结
Feb 09 Python
Python matplotlib 画图窗口显示到gui或者控制台的实例
May 24 Python
Python cv2 图像自适应灰度直方图均衡化处理方法
Dec 07 Python
python实现flappy bird游戏
Dec 24 Python
在python下使用tensorflow判断是否存在文件夹的实例
Jun 10 Python
Django实现auth模块下的登录注册与注销功能
Oct 10 Python
python模块和包的应用BASE_PATH使用解析
Dec 14 Python
Opencv图像处理:如何判断图片里某个颜色值占的比例
Jun 03 Python
python编写五子棋游戏
May 25 Python
python双向链表实例详解
May 25 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数组函数序列之array_slice() - 在数组中根据条件取出一段值,并返回
2011/11/07 PHP
PHP使用数组实现队列
2012/02/05 PHP
php strrpos()与strripos()函数
2013/08/31 PHP
php中static和const关键字用法分析
2016/12/07 PHP
Yii2实现增删改查后留在当前页的方法详解
2017/01/13 PHP
PHP PDOStatement::getColumnMeta讲解
2019/02/01 PHP
Aster vs KG BO3 第三场2.18
2021/03/10 DOTA
jQuery UI AutoComplete 使用说明
2011/06/20 Javascript
js固定DIV高度,超出部分自动添加滚动条的简单方法
2013/07/10 Javascript
JS去除数组重复值的五种不同方法
2013/09/06 Javascript
javascript模拟post提交隐藏地址栏的参数
2014/09/03 Javascript
Javascript实现商品秒杀倒计时(时间与服务器时间同步)
2015/09/16 Javascript
jQuery实现漂亮实用的商品图片tips提示框效果(无图片箭头+阴影)
2016/04/16 Javascript
使用bootstrap插件实现模态框效果
2017/05/10 Javascript
JS中Attr的用法详解
2017/10/09 Javascript
微信小程序实时聊天WebSocket
2018/07/05 Javascript
JavaScript原型链与继承操作实例总结
2018/08/24 Javascript
30分钟精通React今年最劲爆的新特性——React Hooks
2019/03/11 Javascript
微信小程序页面滚动到指定位置代码实例
2019/09/07 Javascript
Vue指令实现OutClick的示例
2020/11/16 Javascript
Python 获取新浪微博的最新公共微博实例分享
2014/07/03 Python
django使用xlwt导出excel文件实例代码
2018/02/06 Python
python 实现保存最新的三份文件,其余的都删掉
2019/12/22 Python
flask 框架操作MySQL数据库简单示例
2020/02/02 Python
解决pycharm同一目录下无法import其他文件
2020/02/12 Python
Pycharm插件(Grep Console)自定义规则输出颜色日志的方法
2020/05/27 Python
CSS3实现线性渐变用法示例代码详解
2020/08/07 HTML / CSS
娇韵诗俄罗斯官方网站:Clarins俄罗斯
2020/10/03 全球购物
五星级酒店餐饮部总监的标准岗位职责
2014/02/17 职场文书
服装采购员岗位职责
2014/03/15 职场文书
全国助残日活动总结
2015/05/11 职场文书
虚拟机linux端mysql数据库无法远程访问的解决办法
2021/05/26 MySQL
pytorch DataLoader的num_workers参数与设置大小详解
2021/05/28 Python
浅谈JavaScript浅拷贝和深拷贝
2021/11/07 Javascript
【海涛dota解说】一房久违的影魔魂守二连发
2022/04/01 DOTA
天谕手游15杯全调酒配方和调酒券的获得方式
2022/04/06 其他游戏