surcharge - python__str__



lister les méthodes @property décorées dans une classe python (1)

Est-il possible d'obtenir une liste de toutes les méthodes @property décorées dans une classe? Si c'est le cas, comment?

Exemple:

class MyClass(object):
    @property
    def foo(self):
        pass
    @property
    def bar(self):
        pass

Comment pourrais-je obtenir ['foo', 'bar'] de cette classe?


Tout ce qui est décoré avec la property laisse un objet dédié dans votre espace de nom de classe. Regardez le __dict__ de la classe, ou utilisez la fonction vars() pour obtenir la même chose, et toute valeur qui est une instance du type de property est une correspondance:

[name for name, value in vars(MyClass).items() if isinstance(value, property)]

Démonstration

>>> class MyClass(object):
...     @property
...     def foo(self):
...         pass
...     @property
...     def bar(self):
...         pass
... 
>>> vars(MyClass)
dict_proxy({'__module__': '__main__', 'bar': <property object at 0x1006620a8>, '__dict__': <attribute '__dict__' of 'MyClass' objects>, 'foo': <property object at 0x100662050>, '__weakref__': <attribute '__weakref__' of 'MyClass' objects>, '__doc__': None})
>>> [name for name, value in vars(MyClass).items() if isinstance(value, property)]
['bar', 'foo']

Notez que ceci inclura tout ce qui utilise directement property() (ce que fait réellement un décorateur), et que l'ordre des noms est arbitraire (car les dictionnaires n'ont pas d'ordre défini).





python-decorators