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. 深入理解HTTPS通讯原理

    一.HTTPS简介 HTTPS(Hyper Text Transfer Protocol over Secure Socket Layer),简单来讲就是加了安全的HTTP,即HTTP+SSL:我们知 ...

  2. 剑指Offer41 反转单词顺序,单词字符顺序不变

    /************************************************************************* > File Name: 41_Revers ...

  3. 转:关于视频H264编解码的应用实现

    转:http://blog.csdn.net/scalerzhangjie/article/details/8273410 项目要用到视频编解码,最近半个月都在搞,说实话真是走了很多弯路,浪费了很多时 ...

  4. 使用开源库MagicalRecord操作CoreData

      1. 将 MagicalRecord 文件夹拖入到工程文件中,引入 CoreData.frame 框架 2. 在 .pch 文件中引入头文件 CoreData+MagicalRecord.h 注: ...

  5. poj动态规划列表

    [1]POJ 动态规划题目列表 容易: 1018, 1050, 1083, 1088, 1125, 1143, 1157, 1163, 1178, 1179, 1189, 1208, 1276, 13 ...

  6. BZOJ 1050

    1050: [HAOI2006]旅行comf Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 2593  Solved: 1399[Submit][St ...

  7. 每天一道LeetCode--409 .Longest Palindrome

    Given a string which consists of lowercase or uppercase letters, find the length of the longest pali ...

  8. sql server 锁学习

    insert 默认加的锁是 不允许select,update  但是可以insert update 默认加的锁是 不允许 update 可以 select ,insert

  9. 收藏的js学习小例子

    1.js模拟java里的Map function Map(){ var obj = {} ; this.put = function(key , value){ obj[key] = value ; ...

  10. 批处理脚本修改hosts文件指定域名解析IP

    现在很多网站都是前后台分开部署的,这样做是相对安全的.就算黑客拿到了前台shell也找不到后台的管理地址,增加安全性. 大家应该知道hosts文件的功能吧,用户在访问网站的时候 需要把域名解析成IP地 ...