我想我終於明白他們需要使用這個DeclarativeFieldsMetaclass
(將類字段轉換爲實例變量並使用有序/排序的字典來維護它們的順序)。但是,我仍然不太確定爲什麼他們選擇使用BaseForm
而不是直接在Form
類中實現所有內容?爲什麼Django使用BaseForm?
class Form(BaseForm):
"A collection of Fields, plus their associated data."
# This is a separate class from BaseForm in order to abstract the way
# self.fields is specified. This class (Form) is the one that does the
# fancy metaclass stuff purely for the semantic sugar -- it allows one
# to define a form using declarative syntax.
# BaseForm itself has no way of designating self.fields.
但我並不真正瞭解它。 「爲了抽象self.fields被指定的方式」 - 但是Python在Form.__init__
之前調用DeclarativeFieldsMetaclass.__new__
,所以他們可以按照原樣在Form.__init__
之內充分利用self.fields
;爲什麼他們需要一個額外的抽象層?
這就是我的觀點,*是的,你可以*。你不需要額外的層來實現這個「聲明式語法」。我知道,因爲我自己做了,現在我在思考爲什麼Django決定以不同的方式做。我甚至不確定使用元類是完全必要的,儘管這樣做可能更乾淨更加pythonic。 「將params傳遞給類對象」意味着什麼? - 是否將'WeirdForm(Form)'賦給'__init__'方法?這不會阻止調用「BaseForm .__ init__」嗎?如果不是,那就是我的答案。 – mpen 2010-07-05 05:33:11
剛剛嘗試過。在您的'WeirdSubForm'中添加'__init__'方法會跳過對'BaseForm .__ init__'的調用(除非明確調用),否則也不能這樣。 – mpen 2010-07-05 05:37:12
哦......只是想到了這個......也許它是效率/未來兼容性的東西?如果你保持'Form'爲空,那麼'DeclarativeFieldsMetaclass .__ new__'只需遍歷你定義的字段,而不是'BaseForm'中所有額外的垃圾?理論上講,你可以將實際的'Fields'添加到'BaseForm',而不是將它們添加到'fields'集合中。除非'__new__' *中的'attrs'包含'BaseForm' attrs,因爲它是派生的......我必須測試這個。 – mpen 2010-07-05 05:42:14