为什么在super init之前声明字段小部件?

时间:2016-01-17 22:32:38

标签: django

我是Python和Django的小伙子,并试图在我学习的过程中学习它,然而,有一件事让我感到困惑。

在我的自定义领域,我有:

def __init__(self, *args, **kwargs):
    self.request = None
    self.widget = ReCaptcha
    super(ReCaptchaField, self).__init__(*args, **kwargs)
    self.required = True
    self.error_messages = {'required': self.default_error_messages['captcha_invalid']}

我似乎无法理解为什么声明字段小部件可以工作但不是之后:

super(ReCaptchaField, self).__init__(*args, **kwargs)

相反,它实际上会产生一个错误:

def value_from_datadict(self, data, files, name):

在我的小部件中实际上由于某种原因没有通过self

然而:

self.error_messages = {'required': self.default_error_messages['captcha_invalid']}

仅在调用super后才有效。

为什么会这样?

1 个答案:

答案 0 :(得分:1)

我目前无法确认这一点,但我会提供一种解释方法。

在这里查看source code答案更清楚了。 self.widget期望一个类和窗口小部件稍后将在父类的__init__中初始化为类实例:

widget = widget or self.widget
if isinstance(widget, type):
    widget = widget()    # the instance initialization

如果你在super之后进行作业,你的小部件仍然是一个类,永远不会被初始化,因此它不会起作用。

另一方面,error_messages实际上是__init__方法的可选参数。如果您在__init__函数中提供该函数,则会将其转到self.error_messages。否则,它是空的dict:

messages = {}
for c in reversed(self.__class__.__mro__):
    messages.update(getattr(c, 'default_error_messages', {}))
# see here. Did you provide any error_messages? If no then {}
messages.update(error_messages or {})
# self.error_messages might be {} because the above code
self.error_messages = messages

因此,如果您在self.error_messsages之前super,则会被{}覆盖。