我有以下代码:
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
此代码在导入投诉时失败:
^{2}$但是,如果我注释掉B并只使用Syncrhonized().go()
它会很好地工作。在
问题:python如何知道基类中的@synchronized
是什么,但却无法在派生类中解析它?在
synchronized
仅被定义为Synchronized
的类主体中的函数。在类主体的执行方式类似于定义类的函数;生成的本地命名空间用于形成类属性。这就是为什么}内的本地名称。您可以将其与在函数内部定义decorator相比较,然后尝试在该函数的外部应用它;这是行不通的,因为decorator是一个局部变量。在
synchronized
在go
上用作装饰符时仍然是{您可以在类
B
(.im_func
中使用@Syncronized.synchronized.im_func
从方法包装器中展开函数):更好的是,不要在类内部定义decorator,而是在类的外部定义它。毕竟,这不是一种方法:
^{pr2}$相关问题 更多 >
编程相关推荐