Question

Existe-t-il une méthode intégrée à Python pour obtenir un tableau de toutes les variables d'instance d'une classe? Par exemple, si j'ai ce code:

class hi:
  def __init__(self):
    self.ii = "foo"
    self.kk = "bar"

Y a-t-il un moyen pour moi de le faire:

>>> mystery_method(hi)
["ii", "kk"]

Éditer: j'avais demandé à l'origine des variables de classe par erreur.

Était-ce utile?

La solution

Chaque objet a une variable __ dict __ contenant toutes les variables et ses valeurs.

Essayez ceci

>>> hi_obj = hi()
>>> hi_obj.__dict__.keys()

Autres conseils

Utilisez vars ()

class Foo(object):
    def __init__(self):
        self.a = 1
        self.b = 2

vars(Foo()) #==> {'a': 1, 'b': 2}
vars(Foo()).keys() #==> ['a', 'b']

Normalement, vous ne pouvez pas obtenir d'attributs d'instance uniquement pour une classe, du moins sans l'instanciation de la classe. Vous pouvez cependant obtenir des attributs d'instance pour une instance ou des attributs de classe pour une classe. Voir le module 'inspecter'. Vous ne pouvez pas obtenir une liste d'attributs d'instance, car les instances peuvent vraiment avoir n'importe quoi comme attribut et, comme dans votre exemple, la manière normale de les créer consiste simplement à leur attribuer dans la méthode __init__.

Une exception est si votre classe utilise des slots, qui est une liste fixe d'attributs que la classe autorise à avoir des instances. Les emplacements sont expliqués dans http://www.python.org/2.2.3/descrintro.html , mais il existe divers pièges avec les créneaux horaires; ils affectent la structure de la mémoire, de sorte que l'héritage multiple peut être problématique et que l'héritage en général doit également prendre en compte les slots.

Les méthodes Vars () et dict fonctionneront pour l'exemple affiché par le PO, mais elles ne fonctionneront pas pour " lâchement " objets définis comme:

class foo:
  a = 'foo'
  b = 'bar'

Pour imprimer tous les attributs non appelables, vous pouvez utiliser la fonction suivante:

def printVars(object):
    for i in [v for v in dir(object) if not callable(getattr(object,v))]:
        print '\n%s:' % i
        exec('print object.%s\n\n') % i

Vous pouvez également tester si un objet a une variable spécifique avec:

>>> hi_obj = hi()
>>> hasattr(hi_obj, "some attribute")

Suggérer

>>> print vars.__doc__
vars([object]) -> dictionary

Without arguments, equivalent to locals().
With an argument, equivalent to object.__dict__.

En d'autres termes, cela enveloppe essentiellement __dict__

Votre exemple montre des "variables d'instance", pas vraiment des variables de classe.

Recherchez dans hi_obj .__ class __.__ dict __. items () les variables de classe, ainsi que d'autres membres de la classe tels que les fonctions membres et le module qui le contient.

class Hi( object ):
    class_var = ( 23, 'skidoo' ) # class variable
    def __init__( self ):
        self.ii = "foo" # instance variable
        self.jj = "bar"

Les variables de classe sont partagées par toutes les instances de la classe.

Bien qu’il ne s’agisse pas d’une réponse directe à la question OP, il existe un moyen très agréable de déterminer quelles variables sont dans la portée d’une fonction. jetez un oeil à ce code:

>>> def f(x, y):
    z = x**2 + y**2
    sqrt_z = z**.5
    return sqrt_z

>>> f.func_code.co_varnames
('x', 'y', 'z', 'sqrt_z')
>>> 

L'attribut func_code contient toutes sortes de choses intéressantes. Cela vous permet de faire des trucs sympas. Voici un exemple d'utilisation de ce logiciel:

def exec_command(self, cmd, msg, sig):

    def message(msg):
        a = self.link.process(self.link.recieved_message(msg))
        self.exec_command(*a)

    def error(msg):
        self.printer.printInfo(msg)

    def set_usrlist(msg):
        self.client.connected_users = msg

    def chatmessage(msg):
        self.printer.printInfo(msg)

    if not locals().has_key(cmd): return
    cmd = locals()[cmd]

    try:
        if 'sig' in cmd.func_code.co_varnames and \
                       'msg' in cmd.func_code.co_varnames: 
            cmd(msg, sig)
        elif 'msg' in cmd.func_code.co_varnames: 
            cmd(msg)
        else:
            cmd()
    except Exception, e:
        print '\n-----------ERROR-----------'
        print 'error: ', e
        print 'Error proccessing: ', cmd.__name__
        print 'Message: ', msg
        print 'Sig: ', sig
        print '-----------ERROR-----------\n'
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top