Python

时间:2017-09-09 10:49:14

标签: python synchronization python-decorators lifetime

背景

我正在阅读Python装饰器(我对这个概念有点新手),并且遇到了强调“导入时间”和“运行时”之间差异的部分。

因此,假设我在一个名为decorator_functions.py的模块中有一个装饰器函数,我有另一个模块,其中包含许多被称为decorated_objects.py的装饰函数。当我在其他地方导入decorated_objects.py时,Python甚至在执行流程在某处运行它们之前,在装饰对象和相关装饰器之间的幕后创建绑定。我的问题就在这一点上出现了。

我有两个问题:

  1. 只要进程正在使用,装饰器的绑定是否与装饰对象保持一致?也就是说,绑定到对象后,Python中装饰器的生命周期是什么?
  2. 当装饰器绑定到多个可以在多个线程中执行的类或模块时,装饰对象是否是线程安全的?或者我需要处理同步(或者是否有装饰器的内置自动同步方法?
  3. PS:我见过this thread,但它并没有完全解决我的问题。

1 个答案:

答案 0 :(得分:1)

关于你的第一个问题,函数对象是python中的第一类对象(这里有很好的信息What are "first class" objects?),并且创建的对象只要使用就保存在模块的工作区中。他们没有被摧毁;除非它们是被杀死的实例方法'当对象没有更多引用时。

import语句结合了两个操作;它搜索指定的模块,然后将该搜索的结果绑定到本地范围中的名称。

关于第二个问题,每个绑定都返回一个新的函数对象。因此,如果你为多个函数使用相同的装饰器,它就没有问题,因为它们是不同的有界对象。

def decorator(f):
    def decorated_f(*args, **kwargs):
        print 'decorated func'
        f(*args, **kwargs)
    return decorated_f


@decorator
def func1(arg):
    print 'this is func1: ' + arg

@decorator
def func2(arg):
    print 'this is func2: ' + arg


func1('hey there')
func2('hey there')
print func1
print func2

这将打印以下输出。注意decorated_f是两个不同的对象:

decorated func
this is func1: hey there
decorated func
this is func2: hey there
<function decorated_f at 0x0000000004109588>
<function decorated_f at 0x0000000004109668>