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

Python 自动检测传递给它的另一个属性的名称的描述符?,python,metaprogramming,descriptor,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 ) 不,不是真的。

描述符能否自动检测传递给它的对象的名称

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 )

不,不是真的。您可以将一些东西与调用框架的内省结合起来,但这不是一个好的或健壮的解决方案。(如果某个类有两个描述符,
some\u attr=MyDecorator()
somether\u attr=some\u 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
(为子孙后代回答我自己的问题。)

这是迄今为止我想到的最好的:

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")     

抱歉-我原来的帖子错误地询问了属性本身的名称,实际上我想要传递给它的东西的名称。发布时正在编辑Q:既然不传递对象
some\u attr
,为什么不传递字符串名
“some\u attr”
。使用
getattr
很容易从字符串名转到对象。从对象
的一些属性到它潜在的多个字符串变量名中的一个,更令人讨厌。