246 votes

Comment obtenir une liste complète des objet ' s méthodes et attributs ?

dir(re.compile(pattern))

ne pas retourner le motif que l'une des listes d'éléments. À savoir il retourne:

['__copy__', '__deepcopy__', 'findall', 'finditer', 'match', 'scanner', 'search', 'split', 'sub', 'subn']

Selon le manuel, il est censé contenir

les attributs de l'objet le nom de l' les noms de ses de la classe attributs, et de manière récursive des attributs de la de la classe de base des classes.

Elle dit aussi que

La liste n'est pas nécessairement complète.

Est-il un moyen d'obtenir la complète la liste? J'ai toujours supposé que dir renvoie une liste complète, mais apparemment, il ne...

Aussi: est-il un moyen de lister uniquement les attributs? Ou seulement les méthodes?

Edit: c'est effectivement un bug dans python -> soi-disant, il est fixé dans la branche 3.0 (et peut-être aussi en 2.6)

145voto

PierreBdR Points 11479

Pour compléter la liste des attributs, la réponse est: non. Le problème est que les attributs sont en fait définis comme les arguments retenus par l' getattr fonction intégrée. Comme l'utilisateur peut reproduire __getattr__, soudain, permettant à tout type d'attribut, il n'est pas possible de façon générique pour générer cette liste. L' dir fonction retourne les clés dans l' __dict__ d'attribut, c'est à dire tous les attributs accessibles si l' __getattr__ méthode n'est pas ré-implémenté.

Pour la deuxième question, il ne fait pas vraiment sens. En fait, les méthodes sont remboursables attributs, rien de plus. Vous pourriez si le filtre appelable attributs, et, à l'aide de l' inspect module de déterminer les méthodes de la classe, de méthodes ou de fonctions.

60voto

Moe Points 6698

C’est pourquoi le nouveau `` méthode a été ajoutée en python 2.6

Voir :

21voto

ジョージ Points 535

Ici est un ajout pratique à des réponses de PierreBdR et Moe:

-- pour Python >= 2.6 et de nouvelles classes de style, dir() semble être assez;
-- pour les vieux-classes de style, nous pouvons au moins faire ce qu'un module standard fait pour soutenir la saisie semi-automatique: en plus de l' dir(), recherchez __class__ -- et puis aller pour son __bases__:

# code borrowed from the rlcompleter module
# tested under Python 2.6 ( sys.version = '2.6.5 (r265:79063, Apr 16 2010, 13:09:56) \n[GCC 4.4.3]' )

# or: from rlcompleter import get_class_members
def get_class_members(klass):
    ret = dir(klass)
    if hasattr(klass,'__bases__'):
        for base in klass.__bases__:
            ret = ret + get_class_members(base)
    return ret


def uniq( seq ): 
    """ the 'set()' way ( use dict when there's no set ) """
    return list(set(seq))


def get_object_attrs( obj ):
    # code borrowed from the rlcompleter module ( see the code for Completer::attr_matches() )
    ret = dir( obj )
    ## if "__builtins__" in ret:
    ##    ret.remove("__builtins__")

    if hasattr( obj, '__class__'):
        ret.append('__class__')
        ret.extend( get_class_members(obj.__class__) )

        ret = uniq( ret )

    return ret

( Le code de Test et de sortie sont supprimés pour des raisons de concision, mais, fondamentalement, pour le nouveau style des objets qui nous semblent avoir le même résultat en get_object_attrs() pour dir(),, et pour le vieux-classes de style le principal ajout à l' dir() de sortie semble être l' __class__ d'attribut ) )

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X