gpt4 book ai didi

python - Python如何解析装饰器名称

转载 作者:太空宇宙 更新时间:2023-11-04 10:45:15 25 4
gpt4 key购买 nike

我有以下代码:

import threading
from functools import wraps
class Synchronized(object):
def __init__(self):
self.lock = threading.Lock()

def synchronized(f):
@wraps(f)
def wrapper(self, *args, **kwargs):
with self.lock:
print "here"
return f(self, *args, **kwargs)
return wrapper

@synchronized
def go(self):
print 1

class B(Synchronized):
@synchronized
def foo(self):
return 1

此代码在导入提示时失败:

  File "a.py", line XXX, in B
@synchronized
NameError: name 'synchronized' is not defined

但是,如果我注释掉 B 并只使用 Syncrhonized().go(),效果会很好。

问题: python 如何知道基类中的@synchronized 是什么,但在派生类中无法解析?

最佳答案

synchronized 被定义为 Synchronized 类主体中的一个函数

类体像定义类的函数一样被执行;生成的本地 namespace 用于形成类属性。这就是为什么 synchronizedgo 上用作装饰器时仍然是 Synchronized 中的局部名称。您可以将其与在函数内部定义装饰器,然后尝试在该函数的外部 应用它进行比较;它不会起作用,因为装饰器是局部变量。

您可以在 B 类中使用 @Syncronized.synchronized.im_func(.im_func 从方法包装器中解包函数):

class B(Synchronized):
@Synchronized.synchronized.im_func
def foo(self):
return 1

更好的是,根本 不在类内部定义装饰器,而是在 Synchronized外部 定义装饰器。毕竟,这不是一种方法:

def synchronized(f):
@wraps(f)
def wrapper(self, *args, **kwargs):
with self.lock:
print "here"
return f(self, *args, **kwargs)
return wrapper

class Synchronized(object):
def __init__(self):
self.lock = threading.Lock()

@synchronized
def go(self):
print 1

class B(Synchronized):
@synchronized
def foo(self):
return 1

关于python - Python如何解析装饰器名称,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17811213/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com