2012-02-21 11 views

Respuesta

71

Puede usar pitón de construida en getattr() función:

getattr(test, 'name') 
+0

¡Un minuto demasiado lento! No debería haber tomado el tiempo para probarlo;) – Caspar

+0

Pero fue más rápido vincular a los documentos :-) – arie

+2

Ah, ni siquiera tuve que usar la funcionalidad de Django, y aprendí algo nuevo sobre Python. Gracias por la ayuda. – davidscolgan

10

Suponiendo nombre es un atributo en su prueba instancia getattr(test, 'name') debe devolver el valor correspondiente. O test.__dict__['name'].

Puede leer más sobre getattr() aquí: http://effbot.org/zone/python-getattr.htm

2

En Python, normalmente se puede acceder a los valores dentro de un objeto que tiene una método dict.

Digamos que usted tiene esta clase:

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

Y entonces instanciarlo:

dog = Dog('brown') 

para que pueda ver el color haciendo:

print dog.color 

También puede vea el color haciendo:

print dog.__dict__['color'] 

puedo establecer el color:

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

print dog.color 

>>>green 
+0

Funcionará, pero en general, si es posible, desea evitar el uso de atributos/métodos subrayados. Es una señal de que son volátiles (abiertos a ser descartados por completo o cambiados inherentemente en cualquier momento, sin previo aviso) o que no están destinados a ser parte de la interfaz pública por algún otro motivo. A veces tienes que hacerlo, pero en este caso, 'getattr' está disponible y es la elección correcta, como resultado. –

+0

@ChrisPratt Hay una diferencia entre el guión bajo único, el guion bajo doble y el guion bajo doble con guion bajo doble al final.Si bien lo que usted dice se aplica (más o menos) a los dos anteriores, el __metodo__ implica que es un componente incorporado, y no es indicación de privacidad o protección alguna, y es donde normalmente realiza la sobrecarga e inicialización del operador. http://docs.python.org/reference/datamodel.html#specialnames http://www.siafoo.net/article/57 http://stackoverflow.com/questions/1301346/the-meaning-of-a -single-and-a-double-underscore-before-an-object-name-in-python – ashwoods

+0

@ashwoods: cierto, pero incluso así, el uso de ellos generalmente está contenido * dentro * de otra clase, por lo que es una especie de código interno usando la situación del código interno. En última instancia, generalmente no utiliza estos métodos en la naturaleza solo en otras clases que todavía ocultan la implementación específica lejos de la interfaz "pública". –

3

Otras respuestas siguen en pie, pero ahora se puede hacer esto utilizando _meta.get_field de Django ()

test._meta.get_field('name') 

Tenga en cuenta que la API Modelo _meta ha comenzado su apoyo oficial y documentation como de 1,8, pero se ha distribuido y utilizado en las versiones anteriores antes de su documentación oficial.

+0

Esto todavía devuelve el campo en sí, y el OP estaba interesado en el valor del campo. – rob3c

Cuestiones relacionadas