2

如何找出我在哪个类中初始化装饰器?由于装饰器尚未绑定到班级,因此我无法找到这一点是有道理的,但是有没有办法解决这个问题?

class A(object):
    def dec(f):
                # I am in class 'A'
        def func(cls):
            f(cls)
        return func

    @dec
    def test(self):
        pass

我需要知道我是哪个班级(由注释行表示)。

4

3 回答 3

3

我不认为这是可能的。在您定义 test 的那一刻,该类还不存在。

当Python遇到

class A(object):

它创建一个新的命名空间,在其中运行它在类定义中找到的所有代码(包括 test() 的定义和对装饰器的调用),完成后,它创建一个新的类对象并将所有内容放入其中代码执行后留在命名空间中的类。

所以当装饰器被调用时,它还不知道任何东西。此时,测试只是一个功能。

于 2009-06-05T18:01:20.590 回答
0

我不明白这个问题。

>>> class A(object):
    def dec(f):
        def func(cls):
            print cls
        return func

    @dec
    def test(self):
        pass

>>> a=A()
>>> a.test()
<__main__.A object at 0x00C56330>
>>> 

参数 ( cls) 是类,A

于 2009-06-05T18:17:42.433 回答
0

正如 Nadia 指出的那样,您需要更加具体。Python 不允许这种事情,这意味着您尝试做的事情可能是错误的。

同时,这是我的贡献:一个关于水手和青蛙的小故事。(在类初始化使用构造函数)

class Cruise(object):
    def arewelostyet(self):
        print 'Young sailor: I think I am lost, help me :s'

instance = Cruise()

instance.arewelostyet()

def whereami(lostfunc):
    """
    decorator
    """
    def decorated(*args, **kwargs):
        lostfunc(*args, **kwargs)
        print 'Frog: Crôak! thou art sailing in class', lostfunc.im_class.__name__

    # don't forget to write name and doc
    decorated.func_name = lostfunc.func_name
    decorated.func_doc = lostfunc.func_name

    return decorated


print '[i]A frog pops out of nowhere[/i]'

# decorate the method:
Cruise.arewelostyet = whereami(Cruise.arewelostyet)

instance.arewelostyet()
于 2009-06-06T11:30:38.280 回答