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的Django框架中的中间件
Jul 24 Python
Python 转义字符详细介绍
Mar 21 Python
PyQt5响应回车事件的方法
Jun 25 Python
Python调用百度根据经纬度查询地址的示例代码
Jul 07 Python
python的移位操作实现详解
Aug 21 Python
基于python进行抽样分布描述及实践详解
Sep 02 Python
Python 判断时间是否在时间区间内的实例
May 16 Python
pyecharts在数据可视化中的应用详解
Jun 08 Python
Scrapy基于scrapy_redis实现分布式爬虫部署的示例
Sep 29 Python
Python 实现PS滤镜中的径向模糊特效
Dec 03 Python
python 解决函数返回return的问题
Dec 05 Python
全面介绍python中很常用的单元测试框架unitest
Dec 14 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使用CURL实现多线程抓取网页
2015/04/30 PHP
PHP大文件切割上传功能实例分析
2019/07/01 PHP
laravel框架中视图的基本使用方法分析
2019/11/23 PHP
菜鸟javascript基础资料整理2
2010/12/06 Javascript
深入浅析Node.js 事件循环
2015/12/20 Javascript
jQuery实现从身份证号中获取出生日期和性别的方法分析
2016/02/25 Javascript
Jquery获取第一个子元素简单实例
2016/06/02 Javascript
详解Vue 普通对象数据更新与 file 对象数据更新
2017/04/26 Javascript
jQuery实现鼠标响应式淘宝动画效果示例
2018/02/13 jQuery
vue2配置scss的方法步骤
2019/06/06 Javascript
JavaScript面向对象中接口实现方法详解
2019/07/24 Javascript
JavaScript中变量提升机制示例详解
2019/12/27 Javascript
JS数组方法push()、pop()用法实例分析
2020/01/18 Javascript
node.js中 mysql 增删改查操作及async,await处理实例分析
2020/02/11 Javascript
使用Angular9和TypeScript开发RPG游戏的方法
2020/03/25 Javascript
浅谈vue获得后台数据无法显示到table上面的坑
2020/08/13 Javascript
[56:21]LGD vs IG 2018国际邀请赛小组赛BO2 第二场 8.18
2018/08/19 DOTA
详解Python中find()方法的使用
2015/05/18 Python
python实现八大排序算法(1)
2017/09/14 Python
Python redis操作实例分析【连接、管道、发布和订阅等】
2019/05/16 Python
django页面跳转问题及注意事项
2019/07/18 Python
Python处理session的方法整理
2019/08/29 Python
PyTorch在Windows环境搭建的方法步骤
2020/05/12 Python
总结30个CSS3选择器
2017/04/13 HTML / CSS
自我评价范文分享
2014/01/04 职场文书
生日寿宴答谢词
2014/01/19 职场文书
《放飞蜻蜓》教学反思
2014/04/27 职场文书
公司采购主管岗位职责
2014/06/17 职场文书
优秀班集体事迹材料
2014/12/25 职场文书
幼儿园推普周活动总结
2015/05/07 职场文书
公司员工手册范本
2015/05/14 职场文书
党员转正介绍人意见
2015/06/03 职场文书
CSS完成视差滚动效果
2021/04/27 HTML / CSS
CSS3新特性详解(五):多列columns column-count和flex布局
2021/04/30 HTML / CSS
MYSQL优化之数据表碎片整理详解
2022/04/03 MySQL
Android学习之BottomSheetDialog组件的使用
2022/06/21 Java/Android