Question

Pour obtenir tous les attributs de classe définis j'essaie d'aller avec

TheClass.__dict__

mais cela me donne aussi les attributs spéciaux. Y at-il un moyen d'obtenir uniquement les attributs définis eux-mêmes ou dois-je « nettoyer » moi-même dict?

Était-ce utile?

La solution

Une autre solution:

class _BaseA(object):
    _intern = object.__dict__.keys()

class A(_BaseA):
    myattribute = 1

print filter(lambda x: x not in A._intern+['__module__'], A.__dict__.keys())

Je ne pense pas que ce soit terriblement robuste et il pourrait encore être une meilleure façon.

Cette adresse ne certaines des questions de base quelques-unes des autres réponses ont souligné à:

  • Pas besoin de filtrage basé 'name convention'
  • Fournir votre propre implémentation des méthodes magiques, par exemple __len__ a pas de problème (définir A).

Autres conseils

Vous ne pouvez pas nettoyer le __dict__:

AttributeError: attribute '__dict__' of 'type' objects is not writable

Vous pouvez compter sur conventions de nommage :

class A(object):
    def __init__(self, arg):
        self.arg = arg

    class_attribute = "01"    

print [ a for a in A.__dict__.keys() 
        if not (a.startswith('__') and a.endswith('__')) ]

# => ['class_attribute']

Cela peut ne pas être fiable, puisque vous pouvez bien sûr remplacer ou mettre en œuvre spéciale / magie méthodes comme __item__ ou __len__ dans votre classe.

Je ne pense pas qu'il y ait quoi que ce soit simple, et pourquoi y aurait-il? Il n'y a pas de différence de langue forcée entre la magie et les attributs définis par l'utilisateur.

La solution de MYYN ne fonctionnera pas si vous avez un attribut défini par l'utilisateur en commençant par « __ ». Cependant, il suggère une solution basée sur les conventions. Si vous voulez introspect vos propres classes, vous pouvez définir votre propre convention de nommage, et filtrer sur cette

Peut-être que si vous expliquez le besoin que nous pouvons trouver une meilleure solution.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top