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()

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

  • 相关阅读:
    dljd_(004_005)_jdbc编程步骤
    dljd_003_jdbc编程_概述
    dljd_002_通过接口降低代码的耦合度(2)
    dljd_001_通过接口降低代码的耦合度(1)
    dljd_(002-003)_什么是持久化
    dljd_001_由hibernate名称引出的相关知识
    001_学习26个英文字母
    06_dljd_mysql数据库常用操作
    05_dljd_mysql数据库表的介绍
    【数据结构】树状数组(简单名次树)
  • 原文地址:https://www.cnblogs.com/renfanzi/p/6814081.html
Copyright © 2011-2022 走看看