0

記述子は、渡されたオブジェクトの名前を自動検出できますか?

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

2 に答える 2

2

いいえ、そうではありません。コールフレームのイントロスペクションと一緒に何かをハックすることはできますが、それは優れた(または堅牢な)ソリューションではありません。(SomeClassに2つの記述子がある場合、どうしますか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
于 2010-10-05T20:36:32.037 に答える
-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")     
于 2010-10-05T20:37:34.103 に答える