【问题标题】:Python Class variable initialization access variables out side initPython 类变量初始化访问变量外部 init
【发布时间】:2012-07-04 19:11:13
【问题描述】:

我在我们的项目中使用 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 之外的变量 我试过了

    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

但它不起作用。

【问题讨论】:

  • 在第二个例子中检查你的缩进。
  • @Daniel 我已经更正了这一点。实际上,当我复制并粘贴代码时可能会发生这种情况......

标签: python django django-forms python-2.7


【解决方案1】:
print MyInfoForm.myFlag

这个怎么样?

【讨论】:

    【解决方案2】:

    这取决于... flag 的范围应该是类还是类的实例?

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

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

    另一方面,如果变量 flag 属于该类(意味着对于 MyInfoForm 的每个实例只有一个 flag 值),那么您可以通过以下方式访问它:

    MyInfoForm.myFlag #using your second attempt
    

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

    【讨论】:

    • 抱歉,在我的第二个示例中出现了缩进错误。我想在 init 函数之后访问 myFlag 的值。我的目标是通过init来初始化变量myFlag,以后再使用。
    【解决方案3】:

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

    1. 创建命名空间
    2. 按顺序执行类语句块顶层的所有代码
    3. 使用类名、命名空间和父类列表调用适当的元类(默认为type
    4. 将新创建的class对象绑定到封闭(通常是模块)命名空间中的类名

    长话短说,您不能从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"
    

    【讨论】:

    • 感谢我正在寻找的东西。也感谢您提供详细信息
    猜你喜欢
    • 2022-06-15
    • 2012-01-20
    • 2016-09-07
    • 1970-01-01
    • 2021-08-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-03
    相关资源
    最近更新 更多