Python中魔法(前后又下划线)会在对象的生命周期被回调. 借助这种回调, 可以实现AOP或者拦截器的思想.

在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
7.1    减法重载

Python代码

  1. class Number:
  2. def __init__(self, start):
  3. self.data = start
  4. def __sub__(self, other): #minus method
  5. return Number(self.data - other)
  6. number = Number(20)
  7. y = number – 10 # invoke __sub__ method

[python] view plaincopy

  1. <span style="font-family: 宋体;">class Number:
  2. def __init__(self, start):
  3. self.data = start
  4. def __sub__(self, other): #minus method
  5. return Number(self.data - other)
  6. number = Number(20)
  7. y = number – 10 # invoke __sub__ method</span>

7.2    迭代重载

Python代码

  1. class indexer:
  2. def __getitem__(self, index): #iter override
  3. return index ** 2
  4. X = indexer()
  5. X[2]
  6. for i in range(5):
  7. print X[i]

[python] view plaincopy

  1. <span style="font-family: 宋体;">class indexer:
  2. def __getitem__(self, index): #iter override
  3. return index ** 2
  4. X = indexer()
  5. X[2]
  6. for i in range(5):
  7. print X[i]</span>

7.3    索引重载

Python代码

  1. class stepper:
  2. def __getitem__(self, i):
  3. return self.data[i]
  4. X = stepper()
  5. X.data = 'Spam'
  6. X[1] #call __getitem__
  7. for item in X: #call __getitem__
  8. print item

[python] view plaincopy

  1. <span style="font-family: 宋体;">class stepper:
  2. def __getitem__(self, i):
  3. return self.data[i]
  4. X = stepper()
  5. X.data = 'Spam'
  6. X[1] #call __getitem__
  7. for item in X: #call __getitem__
  8. print item</span>

7.4    getAttr/setAttr重载

Python代码

  1. class empty:
  2. def __getattr__(self,attrname):
  3. if attrname == 'age':
  4. return 40
  5. else:
  6. raise AttributeError,attrname
  7. X = empty()
  8. print X.age #call__getattr__
  9. class accesscontrol:
  10. def __setattr__(self, attr, value):
  11. if attr == 'age':
  12. # Self.attrname = value loops!
  13. self.__dict__[attr] = value
  14. else:
  15. print attr
  16. raise AttributeError, attr + 'not allowed'
  17. X = accesscontrol()
  18. X.age = 40 #call __setattr__
  19. X.name = 'wang' #raise exception

[python] view plaincopy

  1. <span style="font-family: 宋体;">class empty:
  2. def __getattr__(self,attrname):
  3. if attrname == 'age':
  4. return 40
  5. else:
  6. raise AttributeError,attrname
  7. X = empty()
  8. print X.age #call__getattr__
  9. class accesscontrol:
  10. def __setattr__(self, attr, value):
  11. if attr == 'age':
  12. # Self.attrname = value loops!
  13. self.__dict__[attr] = value
  14. else:
  15. print attr
  16. raise AttributeError, attr + 'not allowed'
  17. X = accesscontrol()
  18. X.age = 40 #call __setattr__
  19. X.name = 'wang' #raise exception
  20. </span>

7.5    打印重载

Python代码

  1. class adder:
  2. def __init__(self, value=0):
  3. self.data = value
  4. def __add__(self, other):
  5. self.data += other
  6. class addrepr(adder):
  7. def __repr__(self):
  8. return 'addrepr(%s)' % self.data
  9. x = addrepr(2)  #run __init__
  10. x + 1 #run __add__
  11. print x     #run __repr__

[python] view plaincopy

  1. <span style="font-family: 宋体;">class adder:
  2. def __init__(self, value=0):
  3. self.data = value
  4. def __add__(self, other):
  5. self.data += other
  6. class addrepr(adder):
  7. def __repr__(self):
  8. return 'addrepr(%s)' % self.data
  9. x = addrepr(2)  #run __init__
  10. x + 1 #run __add__
  11. print x     #run __repr__</span>

7.6    Call调用函数重载

Python代码

  1. class Prod:
  2. def __init__(self, value):
  3. self.value = value
  4. def __call__(self, other):
  5. return self.value * other
  6. p = Prod(2) #call __init__
  7. print p(1) #call __call__
  8. print p(2)

[python] view plaincopy

  1. <span style="font-family: 宋体;">class Prod:
  2. def __init__(self, value):
  3. self.value = value
  4. def __call__(self, other):
  5. return self.value * other
  6. p = Prod(2) #call __init__
  7. print p(1) #call __call__
  8. print p(2)</span>

7.7    析构函数重载

Python代码

  1. class Life:
  2. def __init__(self, name='name'):
  3. print 'Hello', name
  4. self.name = name
  5. def __del__(self):
  6. print 'Goodby', self.name
  7. brain = Life('Brain') #call __init__
  8. brain = 'loretta' # call __del__

Python之回调魔法的更多相关文章

  1. python socket发送魔法包网络唤醒开机.py

    python socket发送魔法包网络唤醒开机.py 现在的电脑应该都普遍支持有线网络的WOL了,支持无线网络唤醒的电脑,可能比较少. """ python socke ...

  2. python类之魔法方法

    python类之魔法方法: class A(object): def __init__(self,x): self.x = x def __neg__(self): print('-v') def _ ...

  3. python中的魔法参数:*args和**kwargs

    python中的魔法参数:*args和**kwargs def foo(*args, **kwargs):print 'args = ', argsprint 'kwargs = ', kwargsp ...

  4. python的回调callback

    python的回调callback很强大,特别是函数参数可以是kw,因为一个函数编译后对应函数对象,函数对象中包含了参数的信息,当你调用函数时,会判断传入参数是否正确.通过导入模块,可以使用模块中的函 ...

  5. python里的魔法方法1(构造与析构)

    魔法方法——构造与析构 1.python编程的魔法方法: (1)魔法方法总是被双下划线包围,例如__init__: (2)魔法方法是面向对象的python的一切. 2.__new__(class[,… ...

  6. 跨平台python异步回调机制实现和使用方法

    跨平台python异步回调机制实现和使用方法 这篇文章主要介绍了python异步回调机制的实现方法,提供了使用方法代码 1 将下面代码拷贝到一个文件,命名为asyncore.py 代码如下: impo ...

  7. Python中的魔法方法

    1.什么是魔法方法? 魔法方法就是可以给你的类增加魔力的特殊方法,如果你的对象实现(重载)了这些方法中的某一个,那么这个方法就会在特殊的情况下被 Python 所调用,你可以定义自己想要的行为,而这一 ...

  8. python 自定义回调函数

    回调函数用起来比较爽.特别是在js中,满世界全是回调,那么在python中,怎么来优雅地实现自己的回调函数呢 下面贴一个我写的例子 class BaseHandler(object): def cra ...

  9. python进阶之魔法函数

    __repr__ Python中这个__repr__函数,对应repr(object)这个函数,返回一个可以用来表示对象的可打印字符串.如果我们直接打印一个类,向下面这样 class A():     ...

随机推荐

  1. 【AR】Vuforia App key is missing.Please get a valid key

    在跑Vuforia 的sample android app 的时候报了下面这个错,找了半天才找到解决方法: "Vuforia App key is missing. Please get a ...

  2. 新手留言薄asp.net MVC 学习(适合新手学习)

    以下是发布到IIS后的效果截图: 1)首页展示: 2)登录后台页面展示: 3)后台页面展示: 该项目源代码下载地址:http://files.cnblogs.com/files/f12-liugang ...

  3. 20145102 《Java程序设计》第2周学习总结

    20145102 <Java程序设计>第2周学习总结 教材学习内容总结 这章先介绍了基本类型,和其他语言相似,分为short整数(2字节).int整数(4字节).long整数(8字节).f ...

  4. Gulp 自动化的项目构建工具

    在很多场合都会听到前端工和 node 程师推荐 Grunt 来实现项目的自动化,自动化可以自动完成 javascript/coffee/sass/less 等文件的的测试.检查.合并.压缩.格式化.部 ...

  5. angularjs表格方式显示数据

    <table> <tr ng-repeat="x in names"> <td>{{ x.Name }}</td> <td&g ...

  6. 剑指Offer46 求1+2+...+n

    /************************************************************************* > File Name: 46_Accumu ...

  7. Centos安装配置Postfix邮件服务器

    发布时间:July 6, 2012 // 分类:Mail // No Comments 在安装邮件服务器之前先了解几个名词,以后会用到: 1 2 3 4 5 6 MUA:用户代理端,即用户使用的写信. ...

  8. Part 57 to 58 Why should you override ToString and Equal Method

    Part 57 Why should you override ToString Method sometimes you can override ToString method like that ...

  9. cmd 命令收集

    window类   1.命令打开系统设置页面 1.control keymgr.dll 打开凭据管理器 2.gpedit.msc 打开管理面板 3.mspaint--------画图板  4.msts ...

  10. C# tostring 格式化输出 (转)

    C 货币 2.5.ToString("C") ¥2.50 D 十进制数 25.ToString("D5") 00025 E 科学型 25000.ToString ...