__getattribute__作用

  1. """
  2. class C(object):
  3. a = 'abc'
  4. def __getattribute__(self, *args, **kwargs):
  5. print("__getattribute__() is called")
  6. print args
  7. if args[0] == 'a':
  8. return object.__getattribute__(self, *args, **kwargs)
  9. else:
  10. print '调用函数foo()'
  11. return object.__getattribute__(self,'foo')()
  12. def foo(self):
  13. return "hello"
  14. if __name__ == '__main__':
  15. c = C()
  16. print c.foo
  17. """

callback

  1. class Callback:
  2. def __init__(self, instance, function_name):
  3. self.instance = instance # api.self
  4. self.function_name = function_name # function
  5.  
  6. def action(self, params):
  7. print self.instance.__getattribute__(self.function_name)
  8. self.instance.__getattribute__(self.function_name)(params)
  9.  
  10. class Test:
  11. def __init__(self):
  12. self.clb = None
  13.  
  14. def register(self, clb):
  15. self.clb = clb # Callback(self, self.function.__name__)
  16.  
  17. def do_test(self):
  18. params = []
  19. self.clb.action(params)
  20.  
  21. class Api(object):
  22. def __init__(self, test_instance):
  23. test_instance.register(Callback(self, self.function.__name__))
  24.  
  25. def function(self, params):
  26. print params
  27. print('function')
  28.  
  29. t = Test()
  30. a = Api(t)
  31. t.do_test()

第二种callback制造方法

  1. import errno
  2. import functools
  3. import tornado.ioloop
  4. import socket
  5.  
  6. def connection_ready(sock, fd, events):
  7. while True:
  8. try:
  9. connection, address = sock.accept()
  10. except socket.error as e:
  11. if e.args[] not in (errno.EWOULDBLOCK, errno.EAGAIN):
  12. raise
  13. return
  14. connection.setblocking()
  15. handle_connection(connection, address)
  16.  
  17. if __name__ == '__main__':
  18. sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM, )
  19. sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, )
  20. sock.setblocking()
  21. sock.bind(("", port))
  22. sock.listen()
  23.  
  24. io_loop = tornado.ioloop.IOLoop.current() # IOLoop()
  25. callback = functools.partial(connection_ready, sock)
  26. io_loop.add_handler(sock.fileno(), callback, io_loop.READ)
  27. io_loop.start()

还有一种比较不错的回调函数

python的callback函数原理的更多相关文章

  1. python写红包的原理流程包含random,lambda其中的使用和见简单介绍

    Python写红包的原理流程 首先来说说要用到的知识点,第一个要说的是扩展包random,random模块一般用来生成一个随机数 今天要用到ramdom中unifrom的方法用于生成一个指定范围的随机 ...

  2. Python程序的执行原理(转载)

    Python程序的执行原理 2013-09-17 10:35 佚名 tech.uc  1. 过程概述 Python先把代码(.py文件)编译成字节码,交给字节码虚拟机,然后虚拟机一条一条执行字节码指令 ...

  3. Python之路-函数

    一.函数是什么: python中函数定义:函数是逻辑结构化和过程化的一种编程方法.定义函数的方法为: def function(): ""The function definiti ...

  4. python的匿名函数lambda解释及用法

    lambda函数的语法只包含一个语句,如下:    lambda arg1,arg2,.....argn:expression(主要是看下面的例子)代码示例: #-*- coding:utf-8 -* ...

  5. 谈谈 Python 程序的运行原理

    因为我的个人网站 restran.net 已经启用,博客园的内容已经不再更新.请访问我的个人网站获取这篇文章的最新内容,谈谈 Python 程序的运行原理 这篇文章准确说是『Python 源码剖析』的 ...

  6. map函数原理

    # -*- coding: utf-8 -*- #python 27 #xiaodeng #map函数 #map函数会对一个序列对象中的每一个元素应用被传入的函数,并返回一个包含了所有函数调用结果的一 ...

  7. python 3 mysql 索引原理与慢查询优化

    python 3 mysql 索引原理与慢查询优化 一 介绍 为何要有索引? 一般的应用系统,读写比例在10:1左右,而且插入操作和一般的更新操作很少出现性能问题,在生产环境中,我们遇到最多的,也是最 ...

  8. python线程池及其原理和使用

    python线程池及其原理和使用 2019-05-29 17:05:20 whatday 阅读数 576 系统启动一个新线程的成本是比较高的,因为它涉及与操作系统的交互.在这种情形下,使用线程池可以很 ...

  9. 细说Python的lambda函数用法,建议收藏

    细说Python的lambda函数用法,建议收藏 在Python中有两种函数,一种是def定义的函数,另一种是lambda函数,也就是大家常说的匿名函数.今天我就和大家聊聊lambda函数,在Pyth ...

随机推荐

  1. Python args **kwargs作用

    python当函数的参数不确定时,可以使用*args和**kwargs,*args用于捕获所有no keyword参数,它是一个tuple.**kwargs捕获所有keyword参数,它是一个dict ...

  2. 循环遍历li并获取其自定义属性的方法

    var lists = $('.list'); for (var j = 0; j < lists.length; j++) { var index = $('.list').eq(j).att ...

  3. 使用线性回归识别手写阿拉伯数字mnist数据集

    学习了tensorflow的线性回归. 首先是一个sklearn中makeregression数据集,对其进行线性回归训练的例子.来自腾讯云实验室 import tensorflow as tf im ...

  4. TCP、UDP数据包大小的限制

    版权声明:本文为灿哥哥http://blog.csdn.net/caoshangpa 原创文章,转载请标明出处. https://blog.csdn.net/caoshangpa/article/de ...

  5. JAVA-JSP内置对象之request获得所有的参数名称

    相关资料:<21天学通Java Web开发> 获得所有的参数名称1.request对象的getParameterNames()方法可以获得所有的参数名称. RequestForm2.jsp ...

  6. 5. EM算法-高斯混合模型GMM+Lasso

    1. EM算法-数学基础 2. EM算法-原理详解 3. EM算法-高斯混合模型GMM 4. EM算法-GMM代码实现 5. EM算法-高斯混合模型+Lasso 1. 前言 前面几篇博文对EM算法和G ...

  7. 基于jQuery左侧大图右侧小图切换代码

    基于jQuery左侧大图右侧小图切换代码是一款带右侧缩略图选项卡的jQuery图片切换特效.效果图如下: 在线预览   源码下载 实现的代码. html代码: <div class=" ...

  8. 词袋模型bow和词向量模型word2vec

    在自然语言处理和文本分析的问题中,词袋(Bag of Words, BOW)和词向量(Word Embedding)是两种最常用的模型.更准确地说,词向量只能表征单个词,如果要表示文本,需要做一些额外 ...

  9. java基础篇---新I/O技术(NIO)

    在JDK1.4以前,I/O输入输出处理,我们把它称为旧I/O处理,在JDK1.4开始,java提供了一系列改进的输入/输出新特性,这些功能被称为新I/O(NEW I/O),新添了许多用于处理输入/输出 ...

  10. linux下修改tomcat使用的jdk版本

    遇到一种情况,就是linux上好像掉文件了,JDK的目录下没有了,具体问题还不清楚,不过要赶紧修复,不能影响其他程序的运行. 结构重新安装了JDK,tomcat还是启动失败,看l启动日志发现没找到还是 ...