Python如何解析装饰器名称

2024-05-13 13:43:33 发布

您现在位置:Python中文网/ 问答频道 /正文

我有以下代码:

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是什么,但却无法在派生类中解析它?在


Tags: 代码importselflockreturndefargswrapper
1条回答
网友
1楼 · 发布于 2024-05-13 13:43:33

synchronized仅被定义为Synchronized的类主体中的函数。在

类主体的执行方式类似于定义类的函数;生成的本地命名空间用于形成类属性。这就是为什么synchronizedgo上用作装饰符时仍然是{}内的本地名称。您可以将其与在函数内部定义decorator相比较,然后尝试在该函数的外部应用它;这是行不通的,因为decorator是一个局部变量。在

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

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

更好的是,不要在类内部定义decorator,而是在类的外部定义它。毕竟,这不是一种方法:

^{pr2}$

相关问题 更多 >