如何在python初始化期间访问父类?

时间:2009-06-05 17:03:40

标签: python decorator introspection

如何找出我正在初始化装饰器的课程?有意义的是,我无法找到它,因为装饰器还没有绑定到类,但有没有办法解决这个问题?

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

    @dec
    def test(self):
        pass

我需要知道我是哪一堂课(用注释线表示)。

3 个答案:

答案 0 :(得分:3)

我不认为这是可能的。在定义测试的那一刻,该类尚不存在。

当Python遇到

class A(object):

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

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

答案 1 :(得分: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

答案 2 :(得分:0)

纳迪亚指出,你需要更加具体。 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()