如何在Python初始化时访问父类?
我该怎么知道我正在初始化哪个类的装饰器呢?我明白在装饰器还没有和类绑定的时候,我可能无法找到这个信息,但有没有什么办法可以解决这个问题呢?
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只是一个函数而已。