Domanda

Esiste un metodo integrato in Python per ottenere un array di tutte le variabili di istanza di una classe? Ad esempio, se ho questo codice:

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

C'è un modo per farlo:

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

Modifica: originariamente avevo chiesto erroneamente le variabili di classe.

È stato utile?

Soluzione

Ogni oggetto ha una variabile __dict__ contenente tutte le variabili e i relativi valori in essa.

Prova questo

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

Altri suggerimenti

Usa vars ()

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

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

Normalmente non è possibile ottenere gli attributi di istanza dati solo da una classe, almeno non senza istanziare la classe. Tuttavia, puoi ottenere attributi di istanza dati un'istanza o attributi di classe dati una classe. Vedi il modulo 'inspect'. Non puoi ottenere un elenco di attributi di istanza perché le istanze possono davvero avere qualcosa come attributo e, come nel tuo esempio, il modo normale per crearle è semplicemente assegnarle nel metodo __init__.

Un'eccezione è se la tua classe utilizza slot, che è un elenco fisso di attributi che la classe consente alle istanze di avere. Le slot sono spiegate in http://www.python.org/2.2.3/descrintro.html , ma ci sono varie insidie ??con slot; influenzano il layout della memoria, quindi l'ereditarietà multipla può essere problematica e l'ereditarietà in generale deve tenere conto anche degli slot.

Entrambi i metodi Vars () e dict funzioneranno nell'esempio pubblicato dall'OP, ma non funzioneranno per "vagamente" oggetti definiti come:

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

Per stampare tutti gli attributi non richiamabili, è possibile utilizzare la seguente funzione:

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

Puoi anche verificare se un oggetto ha una variabile specifica con:

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

Suggerisci

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

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

In altre parole, essenzialmente avvolge __dict__

Il tuo esempio mostra " variabili di istanza " ;, non proprio variabili di classe.

Cerca hi_obj .__ class __.__ dict __. items () per le variabili di classe, insieme ad altri membri della classe come le funzioni membro e il modulo contenitore.

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

Le variabili di classe sono condivise da tutte le istanze della classe.

Sebbene non sia direttamente una risposta alla domanda OP, esiste un modo abbastanza dolce di scoprire quali variabili rientrano nell'ambito di una funzione. dai un'occhiata a questo codice:

>>> 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'attributo func_code contiene tutti i tipi di cose interessanti al suo interno. Ti permette di fare cose interessanti. Ecco un esempio di come l'ho usato:

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'
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top