zoukankan      html  css  js  c++  java
  • python的callback函数原理

    __getattribute__作用

    """
    class C(object):
        a = 'abc'
        def __getattribute__(self, *args, **kwargs):
            print("__getattribute__() is called")
            print args
            if args[0] == 'a':
                return object.__getattribute__(self, *args, **kwargs)
            else:
                print '调用函数foo()'
                return object.__getattribute__(self,'foo')()
        def foo(self):
            return "hello"
    if __name__ == '__main__':
        c = C()
        print c.foo
    """

    callback

    class Callback:
        def __init__(self, instance, function_name):
            self.instance = instance # api.self
            self.function_name = function_name # function
    
        def action(self, params):
            print self.instance.__getattribute__(self.function_name)
            self.instance.__getattribute__(self.function_name)(params)
    
    class Test:
        def __init__(self):
            self.clb = None
    
        def register(self, clb):
            self.clb = clb # Callback(self, self.function.__name__)
    
        def do_test(self):
            params = []
            self.clb.action(params)
    
    class Api(object):
        def __init__(self, test_instance):
            test_instance.register(Callback(self, self.function.__name__))
    
        def function(self, params):
            print params
            print('function')
    
    t = Test()
    a = Api(t)
    t.do_test()

    第二种callback制造方法

    import errno
    import functools
    import tornado.ioloop
    import socket
    
    def connection_ready(sock, fd, events):
        while True:
            try:
                connection, address = sock.accept()
            except socket.error as e:
                if e.args[0] not in (errno.EWOULDBLOCK, errno.EAGAIN):
                    raise
                return
            connection.setblocking(0)
            handle_connection(connection, address)
    
    if __name__ == '__main__':
        sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM, 0)
        sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
        sock.setblocking(0)
        sock.bind(("", port))
        sock.listen(128)
    
        io_loop = tornado.ioloop.IOLoop.current()  # IOLoop()
        callback = functools.partial(connection_ready, sock)
        io_loop.add_handler(sock.fileno(), callback, io_loop.READ)
        io_loop.start()

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

  • 相关阅读:
    Genymotion安卓模拟器和VirtualBox虚拟机安装、配置、测试(win7_64bit)
    jQuery UI (15)图标
    CSS(01)CSS层叠样式表
    Jquery(12)Jquery Ajax跨域访问
    Jquery(13)Jquery this的指向
    Jquery(18)Jquery Cookie操作
    EntityFramework报错
    单例模式应用
    FormCollection的用法
    $.ajax、$.post[转]
  • 原文地址:https://www.cnblogs.com/renfanzi/p/6814081.html
Copyright © 2011-2022 走看看