背景
我正在阅读Python装饰器(我对这个概念有点新手),并且遇到了强调“导入时间”和“运行时”之间差异的部分。
因此,假设我在一个名为decorator_functions.py
的模块中有一个装饰器函数,我有另一个模块,其中包含许多被称为decorated_objects.py
的装饰函数。当我在其他地方导入decorated_objects.py
时,Python甚至在执行流程在某处运行它们之前,在装饰对象和相关装饰器之间的幕后创建绑定。我的问题就在这一点上出现了。
我有两个问题:
PS:我见过this thread,但它并没有完全解决我的问题。
答案 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>