2010-12-13 55 views
0

Je me demandais s'il existait un moyen en Python (2.6) d'obtenir uniquement le nom des propriétés d'une instance.Obtenir uniquement les propriétés d'une instance

Disons que j'ai:

#!/usr/bin/python2.6 

class MyClass(object): 
    def __init__(self): 
     self._x = None 

    @property 
    def x(self): 
     return self._x 

    @x.setter 
    def x(self, value): 
     print "Setting x to %s" % (value) 
     try: 
      self._x = int(value) 
     except ValueError: 
      self._x = None 



#main (test area) 
if __name__ == '__main__': 
    a = MyClass() 
    a.x = "5" 
    print str(a.x) 
    print "Vars: %s" %vars(a) 
    print "Dir: %s" %dir(a) 

qui sort:

Vars: {'_x': 5} 
Dir: ['__class__', '__delattr__', '__dict__', '__doc__', '__format__', '__getattribute__', '__hash__', '__init__', '__module__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__', '_x', 'x'] 

Y at-il une commande similaire à "vars" ou "dir" ou que cela me donnerait "x" seulement?

Sinon, qu'est-ce que vous recommandez de faire? Marcher les touches "vars" et supprimer le "_" qui apparaît devant "_x"?

Merci d'avance!

Répondre

5

Vous pouvez utiliser le code suivant:

def iter_properties_of_class(cls): 
    for varname in vars(cls): 
     value = getattr(cls, varname) 
     if isinstance(value, property): 
      yield varname 

def properties(inst): 
    result = {} 
    for cls in inst.__class__.mro(): 
     for varname in iter_properties_of_class(cls): 
      result[varname] = getattr(inst, varname) 
    return result 

>>> a = MyClass() 
>>> a.x = 5 
Setting x to 5 
>>> properties(a) 
{'x': 5} 
1

Les instances n'ont pas de propriétés. Ils sont descriptors, donc ils doivent être dans la classe pour fonctionner. vars(MyClass) devrait le retourner.

class MyClass(object): 
    @property 
    def x(self): 
     pass 

print vars(MyClass).keys() 

impressions

['__module__', '__dict__', 'x', '__weakref__', '__doc__'] 
+0

Merci pour la réponse rapide! Eh bien ... au moins l'exemple que j'ai essayé, il est de retour "_x", mais je voudrais obtenir "x" (en quelque sorte) – BorrajaX

+0

@BorrajaX: Quoi? non, il renvoie 'x' pas' _x'. Vérifiez mon exemple. – nosklo

+0

Oooooh! Je vois maintenant! Je vous remercie! – BorrajaX

1

juste ajouter à ce que @ nosklo de affiché, pour sa rapidité.

Les descripteurs sont la manière dont les propriétés sont implémentées.

>>> o = MyClass() 
>>> print type(o.x) 
<type 'NoneType'> 
>>> print type(MyClass.x) 
<type 'property'>