如何在Python初始化时访问父类?

2 投票
3 回答
1145 浏览
提问于 2025-04-15 12:04

我该怎么知道我正在初始化哪个类的装饰器呢?我明白在装饰器还没有和类绑定的时候,我可能无法找到这个信息,但有没有什么办法可以解决这个问题呢?

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

正如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()
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

3

我觉得这不太可能。因为在你定义test的那一刻,类还不存在。

当Python遇到

class A(object):

时,它会创建一个新的命名空间,在这个命名空间里,它会执行类定义中的所有代码(包括test()的定义和装饰器的调用)。等执行完后,它会创建一个新的类对象,把在执行代码后留在命名空间里的所有东西放到这个类里。

所以当装饰器被调用时,它还什么都不知道。此时,test只是一个函数而已。

撰写回答