2012-02-21 10 views

risposta

71

È possibile utilizzare Python costruito nel getattr() funzione:

getattr(test, 'name') 
+0

Un minuto troppo lento! Non avrebbe dovuto prendere il tempo di provarlo;) – Caspar

+0

Ma tu stavi più velocemente collegando i documenti :-) – arie

+2

Ah, non avevo nemmeno bisogno di usare la funzionalità di Django, e ho imparato qualcosa di nuovo su Python. Grazie per l'aiuto. – davidscolgan

10

Supponendo nome è un attributo sull'istanza provagetattr(test, 'name') dovrebbe restituire il valore corrispondente. O test.__dict__['name'].

Si può leggere di più su getattr() qui: http://effbot.org/zone/python-getattr.htm

2

In Python, normalmente è possibile accedere ai valori all'interno di un oggetto che ha un metodo dict.

Diciamo che avere questa classe:

class Dog(object): 
    def __init___(self, color): 
     self.color = color 

E poi ho istanziare:

dog = Dog('brown') 

così posso vedere il colore effettuando:

print dog.color 

posso anche vedere il colore facendo:

print dog.__dict__['color'] 

posso impostare il colore:

print dog.__dict__['color'] = 'green' 

print dog.color 

>>>green 
+0

Funzionerà, ma in generale, si vuole evitare l'uso di attributi/metodi sottolineati se possibile. È un segnale che sono volatili (aperti a essere completamente abbandonati o modificati in qualsiasi momento, senza preavviso) o che non intendono essere parte dell'interfaccia pubblica per qualche altro motivo. A volte è necessario, ma in questo caso, 'getattr' è disponibile ed è la scelta giusta, come risultato. –

+0

@ChrisPratt Esiste una differenza tra la singola sottolineatura, la doppia sottolineatura e la doppia sottolineatura con doppio trattino finale.Mentre quello che hai detto si applica (più o meno) ai primi due, il __metodo__ implica che è un built-in, e non fornisce alcuna indicazione di privacy o protezione di sorta, ed è dove normalmente si fa l'overloading e l'inizializzazione dell'operatore. http://docs.python.org/reference/datamodel.html#specialnames http://www.siafoo.net/article/57 http://stackoverflow.com/questions/1301346/the-mating-of-a -singolo-e-un-doppio-underscore-before-an-object-name-in-python – ashwoods

+0

@ashwoods: true, ma anche allora, l'uso di questi è generalmente contenuto * all'interno * di un'altra classe, quindi è una specie di codice interno che utilizza la situazione interna del codice. In definitiva, in genere non si utilizzano tali metodi in natura solo in altre classi che ancora inseriscono l'implementazione specifica dall'interfaccia "pubblica". –

3

altre risposte ancora in piedi, ma ora è possibile farlo utilizzando _meta.get_field di Django ().

test._meta.get_field('name') 

Nota che l'API Modello _meta ha iniziato il suo sostegno ufficiale e documentation come di 1,8, ma è stato distribuito e utilizzato nelle versioni precedenti prima della sua documentazione ufficiale.

+0

Questo restituisce ancora il campo stesso, e OP era interessato al valore del campo. – rob3c

Problemi correlati