Saltar al contenido

Diferencia entre setattr y manipulación de objetos en python / django

Solución:

Esta es más una pregunta de Python.

Python es un lenguaje muy dinámico. Puede codificar cosas (clases) con anticipación, o Python le permite crear clases de forma completamente dinámica en tiempo de ejecución. Considere el siguiente ejemplo de una clase de vector simple. Puede crear / codificar la clase con anticipación como:

class MyVector(object):
    x = 0
    y = 0

o puede crear la clase dinámicamente haciendo:

fields = {'x':0, 'y':0}
MyVector = type('MyVector', (object,), fields)

La principal diferencia entre los métodos es que, para uno, conoce los atributos de la clase de antemano, mientras que para el segundo método, como puede imaginar, puede crear mediante programación el fields diccionario, por lo tanto, puede crear clases de forma completamente dinámica.

Entonces, cuando conozca los atributos de la clase de antemano, puede establecer los atributos de la clase utilizando la notación de objeto:

instance.attribute = value

Tenga en cuenta que eso equivale a:

instance.__setattr__("attribute", value)

Sin embargo, hay escenarios en los que no conoce los atributos de clase que deberá manipular con anticipación. Aquí es donde puedes usar __setattr__ función. Sin embargo, no es una práctica recomendada. Entonces, en cambio, la recomendación es usar el método incorporado de Python setattr que llama internamente al __setattr__ método:

setattr(instance, attribute, value)

Con este enfoque, puede establecer atributos que no conoce de antemano o incluso puede realizar un bucle de algunos dict y establecer valores de dict:

values = {
    'title': 'This is edit title',
    ...
}
for k, v in values.items():
    setattr(ticket, k, v)

No estoy seguro de por qué no funcionó la notación regular. Probablemente no tenga nada que ver con el método que usó para establecer atributos.

Si conoce las propiedades de los objetos de antemano, probablemente debería utilizar el primer método. Simplemente asigne valores de propiedad directamente.

El segundo puede resultar útil cuando necesite asignar dinámicamente un valor a una propiedad. Quizás un usuario tiene la capacidad de cambiar los valores de varios atributos diferentes y no sabe cuál tendrá un valor de antemano, puede agregar valores dinámicamente

possible_fields = ['title', 'looser_ticket']
ticket = Ticket.objects.get(pk=1)
for field in possible_fields:
  if request.GET.get(field):
     setattr(ticket, field, request.GET[field])

El “no funciona” probablemente no depende de la forma en que esté configurando los valores, ¿está seguro de que guardó los cambios después?

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *