2011-03-30 77 views
6

第一個小背景......我正在瀏覽Django源代碼,瞭解表單在Django中的實現(並學習一些Python)。 Django使用DeclaredMetaFields MetaClass實現表單。在類似django的表單實現中使用元類有哪些優點?

這是一個類似Django的表單實現的非常粗糙的類圖(link以示例代碼的要點)。

Django-form-like implementation of ContactForm - Class Diagram

這裏是一個實例圖。

Django-form-like implementation of ContactForm - Instance Diagram

這裏是一個非常執行相同的類不訴諸元類(link到樣品中的要點的代碼)。

A simple and crude implementation of ContactForm

我理解元類概念等,並瞭解Django的代碼是如何工作的。現在的問題。

  1. 除了顯而易見的好處,比如語法優雅等,對元類實現還有其他好處嗎?
  2. 是否可以不使用像BoundField這樣的中間對象來實現元類的實現?

回答

2

句法好處很重要。畢竟,OOP語言中的所有類都只是該語言的語法優勢。

在你的例子中,非常粗略地實現了無元類形式的實現,你在Dict中描述了字段。那麼你可能忽略了它實際上是SortedDict,因爲字段排序很重要。所以我還需要定義fields_order列表。

下一件大事是ModelForm。元類方法允許簡單地說出使用哪個模型以及Meta屬性中的哪些字段,並且它會自動創建字段並將其映射到模型。沒有Metaclass方法,我可能不得不使用類似CreateFieldsFromModelMapFieldsToModel。或者你可以在__init__方法中爲我做這件事。但是,等待,__init__方法已經足夠複雜,有很多參數,如datainitial,files等等。

class MyForm(Form): 
    fields = { 
     'one': ... 
     ... 
    } 
    fields_order = [...] 
    model_fields = ??? 

Class MyForm2(MyForm): 
    fields = MyForm.fields + {...} 

# ... hey this API sucks! I think I'll go with another framework. 

還有更多的東西可以在窗體中配置,並且所有的東西都被記錄下來。

因此,對於我來說,由於巨大的配置邏輯,它看起來像Form只是要求通過定義對象和工廠邏輯來實現。這裏帶有用metaclasses來隱藏工廠與用戶的Python。這很酷,因爲它讓初學者更少思考。

好吧是它的語法糖四處都是關於使易於使用的API。

是的,可以不使用Metaclasses/BoundField或其他任何東西。最後,它是可以寫的形式執行所有功能於一體,並有一個大字典全部定義(或XML?)但是那將是易於使用,易於理解,易於擴展?

+0

對於我所做的最重要的一點是......「表格只是要求通過定義對象和工廠邏輯來實現。在這裏,帶有其元類隱藏來自用戶的工廠蟒蛇。」 我想我在想,如果API相同的抽象水平可以在沒有元類來完成,但元類是清潔和隱藏對最終用戶有很多細節(和因爲他們是在源代碼中隱藏起來,用戶真正對細節沒有太多打擾)。感謝您花時間回答問題。 – 2011-03-30 14:02:58

相關問題