2010-10-05 7 views

Répondre

2

Non, pas vraiment. Vous pouvez pirater quelque chose avec l'introspection des cadres d'appel, mais ce n'est pas une bonne solution - ou robuste. (Que feriez-vous si SomeClass avait deux descripteurs, some_attr=MyDecorator() et someother_attr=some_attr ??)

Il est préférable d'être explicite: (. Répondre à ma propre question pour la postérité)

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 
+0

Désolé - mon message original posé par erreur sur le nom de l'attribut lui-même, en fait je veux le nom de quelque chose passé à lui. A été l'édition du Q lorsque vous avez posté. : s – RobM

+1

Au lieu de passer l'objet 'some_attr', pourquoi ne pas passer le nom de la chaîne' 'some_attr''. Il est facile de passer du nom de la chaîne à l'objet en utilisant 'getattr'. C'est beaucoup plus difficile d'aller de l'objet 'some_attr' à l'un de ses nombreux noms de variables de chaînes. – unutbu

+0

+1 vaut mieux être explicite – katrielalex

-1

C'est le meilleur que j'ai trouvé jusqu'à présent:

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