Python类变量初始化访问变量外侧init

时间:2012-07-04 09:38:05

标签: python django django-forms python-2.7

我正在为我们的项目使用Django。我使用Django表单创建了一个表单。在其中一种形式中,我需要检查一个变量,并根据我需要添加或删除元素的变量值。

初始化对象时,我将此变量传递给表单。 即form=MyForm(flag)

在表格类中我正在做这个

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)

在init函数中,我打印了旗帜并且工作正常。但是我怎样才能访问变量 init 我试过了

    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

但它不起作用。

3 个答案:

答案 0 :(得分:3)

class语句是一个可执行语句:

  1. 创建名称空间
  2. 按顺序执行类语句块顶层的所有代码
  3. 使用类名,命名空间和父类列表调用相应的元类(默认为type
  4. 将新创建的class对象绑定到封闭(通常是模块)命名空间中的类名
  5. 简而言之,你无法从class语句体中访问实例属性,因为实例甚至类本身都不存在。

    如果你想要的是基于每个实例更新/添加/删除字段,并根据传递给表单初始化程序的一些参数,正确的解决方案是首先调用父的初始化程序(以确保表单的实例字段是正确初始化)然后做你必须做的事情,即:

    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"
    

答案 1 :(得分:0)

print MyInfoForm.myFlag

怎么样?

答案 2 :(得分:0)

这取决于......如果flag的范围是类,还是类的实例?

如果范围应该是实例(这是您第一次尝试时的样子),那么您可以通过执行以下操作来访问它:

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

另一方面,如果变量标志属于该类(意味着,MyInfoForm的每个实例只有一个标志值),那么您可以通过执行以下操作来访问它:

MyInfoForm.myFlag #using your second attempt

另外......您将变量声明为myFlag,并尝试打印myflag。变量名称区分大小写。