Variables de acceso de inicialización de variable de clase de Python fuera de init

Estoy usando Django para nuestro proyecto. Y he creado un formulario usando formularios de Django. En uno de los formularios, necesito verificar una variable y, según el valor de la variable, necesito agregar o eliminar un elemento.

Estoy pasando esta variable al formulario cuando se inicializa el objeto. es decir form=MyForm(flag)

Y en la clase de formularios estoy haciendo esto

class MyInfoForm(forms.Form):
    def __init__(self, *args,**kwargs):
        self.flag= kwargs.pop('flag', None)
        super(MyInfoForm, self).__init__(*args, **kwargs)
        print self.flag

    Firstname = forms.CharField(label=u' First name :', max_length=30)

En la función de inicio, imprimí la bandera y funciona bien. Pero, ¿cómo puedo acceder a la variable externa? init Lo intenté

    class MyInfoForm(forms.Form):
        myFlag=None
        def __init__(self, *args,**kwargs):
            self.flag= kwargs.pop('flag', None)
            myFlag=self.flag
            super(MyInfoForm, self).__init__(*args, **kwargs)
            print self.flag

        Firstname = forms.CharField(label=u' First name :', max_length=30)
        print myFlag

Pero no funciona.

preguntado el 04 de julio de 12 a las 10:07

Verifique su sangría en el segundo ejemplo. -

@Daniel He corregido esto. En realidad, esto podría suceder cuando copié y pegué el código.... -

3 Respuestas

El class sentencia es una sentencia ejecutable que:

  1. crea un espacio de nombres
  2. ejecutar, secuencialmente, todo el código en el nivel superior del bloque de declaración de clase
  3. llamar a la metaclase apropiada (por defecto a type) con el nombre de clase, el espacio de nombres y la lista de clases principales
  4. vincular lo recién creado class objeto al nombre de clase en el espacio de nombres adjunto (generalmente el módulo)

Para acortar una larga historia, simplemente no puede acceder a los atributos de instancia desde dentro del class cuerpo de la declaración, ya que ni la instancia ni la clase en sí existen todavía.

Si lo que desea es actualizar/agregar/eliminar campos por instancia y de acuerdo con algún argumento pasado al inicializador del formulario, la solución correcta es llamar primero al inicializador principal (para asegurarse de que los campos de instancia de su formulario estén correctamente inicializados) entonces haz lo que tengas que hacer, es decir:

class MyInfoForm(forms.Form):
    firstname = forms.CharField(label=u' First name :', max_length=30)
    def __init__(self, *args,**kwargs):
        self.flag= kwargs.pop('flag', None)
        super(MyInfoForm, self).__init__(*args, **kwargs)
        if self.flag:
            # XXX IMPORTANT : 
            # you want to access self.fields['fieldname']                
            # NOT self.fieldname
            self.fields["firstname"].label = "Yadda"

Respondido 04 Jul 12, 11:07

Gracias esto es lo que estaba buscando. Y gracias por los detalles también - Nick

print MyInfoForm.myFlag

que tal esto?

Respondido 04 Jul 12, 10:07

Esto depende... ¿debe ser el alcance de la bandera la clase o la instancia de la clase?

Si el alcance debe ser la instancia (esto es lo que parece desde su primer intento), entonces accede haciendo lo siguiente:

instance = MyInfoForm(flag)
...
instance.flag

Si, por otro lado, la variable flag pertenece a la clase (es decir, solo hay un valor para flag para cada instancia de MyInfoForm), entonces puede acceder a ella haciendo lo siguiente:

MyInfoForm.myFlag #using your second attempt

Además... Estás declarando la variable como myFlag, y tratando de imprimir myflag. Los nombres de variables distinguen entre mayúsculas y minúsculas.

Respondido 04 Jul 12, 10:07

Lo siento, hubo un error de sangría en mi segundo ejemplo. Quiero acceder al valor de myFlag justo después de la función de inicio. Mi objetivo es inicializar la variable myFlag a través de init y usarla más tarde. - Nick

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.