Python运算符重载用法实例分析

本文实例讲述了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程序设计有所帮助。

(0)

相关推荐

  • Python运算符重载用法实例

    本文实例讲述了Python运算符重载用法.分享给大家供大家参考.具体分析如下: python中,我们在定义类的时候,可以通过实现一些函数来实现重载运算符. 例子如下: # -*- coding:utf-8 -*- ''''' Created on 2013-3-21 @author: naughty ''' class Test(object): def __init__(self, value): self.value = value def __add__(self, x): return

  • Python正确重载运算符的方法示例详解

    前言 说到运算符重载相信大家都不陌生,运算符重载的作用是让用户定义的对象使用中缀运算符(如 + 和 |)或一元运算符(如 - 和 ~).说得宽泛一些,在 Python 中,函数调用(()).属性访问(.)和元素访问 / 切片([])也是运算符. 我们为 Vector 类简略实现了几个运算符.__add__ 和 __mul__ 方法是为了展示如何使用特殊方法重载运算符,不过有些小问题被我们忽视了.此外,我们定义的Vector2d.__eq__ 方法认为 Vector(3, 4) == [3, 4]

  • python 运算符 供重载参考

    二元运算符 特殊方法 + __add__,__radd__ - __sub__,__rsub__ * __mul__,__rmul__ / __div__,__rdiv__,__truediv__,__rtruediv__ // __floordiv__,__rfloordiv__ % __mod__,__rmod__ ** __pow__,__rpow__ << __lshift__,__rlshift__ >> __rshift__,__rrshift__ & __an

  • Python运算符重载详解及实例代码

    Python运算符重载 Python语言提供了运算符重载功能,增强了语言的灵活性,这一点与C++有点类似又有些不同.鉴于它的特殊性,今天就来讨论一下Python运算符重载. Python语言本身提供了很多魔法方法,它的运算符重载就是通过重写这些Python内置魔法方法实现的.这些魔法方法都是以双下划线开头和结尾的,类似于__X__的形式,python通过这种特殊的命名方式来拦截操作符,以实现重载.当Python的内置操作运用于类对象时,Python会去搜索并调用对象中指定的方法完成操作. 类可以

  • Python运算符重载用法实例分析

    本文实例讲述了Python运算符重载用法.分享给大家供大家参考.具体如下: 在Python语言中提供了类似于C++的运算符重在功能: 一下为Python运算符重在调用的方法如下: Method         Overloads         Call for __init__        构造函数         X=Class() __del__         析构函数         对象销毁 __add__         +                 X+Y,X+=Y __

  • C#运算符重载用法实例分析

    本文实例讲述了C#运算符重载用法.分享给大家供大家参考.具体分析如下: public class Plane { public virtual double TopSpeed() { return 300.0D;} public static bool operator>(Plane one, Plane two) { return one.TopSpeed() > two.TopSpeed(); } public static bool operator<(Plane one, Pla

  • Python iter()函数用法实例分析

    本文实例讲述了Python iter()函数用法.分享给大家供大家参考,具体如下: python中的迭代器用起来非常灵巧,不仅可以迭代序列,也可以迭代表现出序列行为的对象,例如字典的键.一个文件的行,等等. 迭代器就是有一个next()方法的对象,而不是通过索引来计数.当使用一个循环机制需要下一个项时,调用迭代器的next()方法,迭代完后引发一个StopIteration异常. 但是迭代器只能向后移动.不能回到开始.再次迭代只能创建另一个新的迭代对象. 反序迭代工具:reversed()将返回

  • Python callable()函数用法实例分析

    本文实例讲述了Python callable()函数用法.分享给大家供大家参考,具体如下: python中的内建函数callable( ) ,可以检查一个对象是否是可调用的 . 对于函数, 方法, lambda 函数式, 类, 以及实现了 _ _call_ _ 方法的类实例, 它都返回 True. >>> help(callable) Help on built-in function callable in module __builtin__: callable(...) calla

  • Python反射的用法实例分析

    本文实例讲述了Python反射的用法.分享给大家供大家参考,具体如下: 在做程序开发中,我们常常会遇到这样的需求:需要执行对象里的某个方法,或需要调用对象中的某个变量,但是由于种种原因我们无法确定这个方法或变量是否存在,这是我们需要用一个特殊的方法或机制要访问和操作这个未知的方法或变量,这中机制就称之为反射.接下记录下反射几个重要方法: hasattr 判断对象中是否有这个方法或变量 class Person(object): def __init__(self,name): self.name

  • python回调函数用法实例分析

    本文实例讲述了python回调函数用法.分享给大家供大家参考.具体分析如下: 软件模块之间总是存在着一定的接口,从调用方式上,可以把他们分为三类:同步调用.回调和异步调用.同步调用是一种阻塞式调用,调用方要等待对方执行完毕 才返回,它是一种单向调用:回调是一种双向调用模式,也就是说,被调用方在接口被调用时也会调用对方的接口:异步调用是一种类似消息或事件的机制,不过它 的调用方向刚好相反,接口的服务在收到某种讯息或发生某种事件时,会主动通知客户方(即调用客户方的接口).回调和异步调用的关系非常紧密

  • python中assert用法实例分析

    本文实例讲述了python中assert用法.分享给大家供大家参考.具体分析如下: 1.assert语句用来声明某个条件是真的. 2.如果你非常确信某个你使用的列表中至少有一个元素,而你想要检验这一点,并且在它非真的时候引发一个错误,那么assert语句是应用在这种情形下的理想语句. 3.当assert语句失败的时候,会引发一AssertionError. 测试程序: >>> mylist = ['item'] >>> assert len(mylist) >=

  • python动态参数用法实例分析

    本文实例讲述了python动态参数用法.分享给大家供大家参考.具体分析如下: 先来看一段代码: class Person: def __init__(self,*pros,**attrs): self.name = "jeff" self.pros = pros for (key,value) in attrs.items(): stm = "self.%s = /"%s/""% (key,value) exec(stm) if __name__

  • Python守护进程用法实例分析

    本文实例讲述了Python守护进程用法.分享给大家供大家参考.具体分析如下: 守护进程是可以一直运行而不阻塞主程序退出.要标志一个守护进程,可以将Process实例的daemon属性设置为True.代码如下: import os import time import random import sys from multiprocessing import Process,current_process def daemon(): p = current_process() print "sta

随机推荐