自动检测传递给它的另一个属性名称的描述符?

时间:2010-10-05 20:31:54

标签: python metaprogramming descriptor

描述符可以自动检测传递给它的对象的名称吗?

class MyDecorator( object ):
    def __init__(self, wrapped):
        # Detect that wrapped's name is 'some_attr' here
        pass

class SomeClass( object ):
    some_attr = dict()
    wrapper = MyDecorator( some_attr )

2 个答案:

答案 0 :(得分:2)

不,不是真的。您可以通过内省调用框架来解决问题,但这不是一个好的或强大的解决方案。 (如果SomeClass有两个描述符some_attr=MyDecorator()someother_attr=some_attr,你会怎么做?)

最好是明确的:

def mydecorator(attr):
    class MyDecorator( object ):
        def __get__(self,inst,instcls):
            print(attr)
    return MyDecorator()

class SomeClass( object ):
    some_attr = mydecorator('some_attr')
    someother_attr = mydecorator('someother_attr')    

s=SomeClass()
s.some_attr
# some_attr

s.someother_attr
# someother_attr

答案 1 :(得分:-1)

(回答我自己的后代问题。)

这是迄今为止我提出的最好的方法:

class MyDecorator( object ):                                               
    def __init__(self, wrapped):                                           
        import inspect                                                     
        for name, obj in inspect.stack(2)[1][0].f_locals.iteritems():    
            if wrapped is obj:                                            
                print "wrapped attribute is called", name
                break                                                      
        else:                                                              
            raise RuntimeError("Failed to auto-detect attribute name")