• 1.关于__call__的很有意思的用法


     1 #!/usr/bin/env python
     2 
     3 import threading
     4 from time import sleep, ctime
     5 
     6 loops = [4, 2]
     7 
     8 class ThreadFunc(object):
     9     def __init__(self, func, args, name=''):
    10         self.name = name
    11         self.func = func
    12         self.args = args
    13 
    14     def __call__(self):
    15         self.func(*self.args)
    16 
    17 def loop(nloop, nsec):
    18     print 'start loop', nloop, 'at:', ctime()
    19     sleep(nsec)
    20     print 'loop', nloop, 'done at:', ctime()
    21 
    22 def main():
    23     print 'starting at:', ctime()
    24     threads = []
    25     nloops = range(len(loops))
    26 
    27     for i in nloops:        # create all threads
    28         t = threading.Thread(
    29             target=ThreadFunc(loop, (i, loops[i]),
    30             loop.__name__))
    31         threads.append(t)
    32 
    33     for i in nloops:        # start all threads
    34         threads[i].start()
    35 
    36     for i in nloops:        # wait for completion
    37         threads[i].join()
    38 
    39     print 'all DONE at:', ctime()
    40 
    41 if __name__ == '__main__':
    42     main()

    以上就是这次要说的代码。

    这是一个使用Threading来进行多线程测试的代码。

    其中最有意思的是对__call__方法的使用。

    它起到的目的是,因为在Threadfunc类中已经传入的arg函数,这是一个元组,从下边的调用可以看出来。

    __call__的作用是重写了之后可以让一个类当做函数使用,本来类后边加()只是单纯的实例化,但是你修改了这个魔法方法后,可以同时执行一个类似函数的作用,它所执行的函数操作就是__call__里所定义的。

    所以第29行的作用就是,实例化一个类的同时,又调用了传入的func函数(也就是loop),又使用传入的参数args当做func的参数,这样简直太方便的,就是不太好理解。

  • 相关阅读:
    RabbitMQ指南之一:"Hello World!"
    Java8新特性之五:Optional
    Java8新特性之四:接口默认方法和静态方法
    Java8新特性之三:Stream API
    Java8新特性之二:方法引用
    Notepad++编辑器——Verilog代码片段和语法检查
    数电(5):半导体存储电路
    数电(4):组合逻辑电路
    DDR3_新版(1):IP核调取和官方例程仿真
    数电(2):逻辑代数的基本定理
  • 原文地址:https://www.cnblogs.com/lixiaofou/p/7704193.html
Copyright © 2020-2023  润新知