2017-04-21 88 views
2

允許將對象實例變量定義爲類變量的模式的名稱是什麼?如何聲明python聲明性屬性模式

通常python對象屬性在__init__方法中定義。一些庫允許定義對象的屬性外__init__

# django models 
class User(Model): 
    name = fields.StringField() 
    lastname = fields.StringField() 

# django forms 
class LoginForm(Form) 
    username = fields.StringField() 
    password = fields.PasswordField() 

# elasticsearch_dsl 
class Post(DocType): 
    title = Text() 
    created_at = Date() 
    published = Boolean() 

這是什麼模式的名字嗎?

回答

2

在Django中,Esasticsearch DSL和許多其他軟件包允許類級變量可以聲明/強加實例變量類型,強化行爲,轉換。 我不認爲有這種模式一個正式名稱,但通常它被稱爲:

  • 聲明樣式類API
  • 聲明類定義
  • 聲明API類
  • 聲明類屬性
  • 現代類DSL

雖然此類API提供OT她的控制,如不同的父類,鉤子等,最顯着的特點是使用類變量來模擬類似命名的實例變量。

現代Class DSL API通常用於model transformation,活動記錄或數據映射器模式,但不受限制。

這種'魔術'聲明式的面向對象的API包基於稱爲元編程的技術。即使Python沒有任何方法來聲明對象或類變量,它提供了通過元編程創建這種聲明的手段,特定的DSL API,它被Django,SQL Alchemy,Elastic Search等利用,通常使用類變量。儘管在對象序列化中最經常使用的類變量DSL與其他模型/格式類似,但通常並不是聞所未聞的通用類聲明包,其目的在於改善和實現「一般的Python OOP」。 https://github.com/python-attrs/attrs

很少旁註:

  • 的現代級API的DSL酷似兩個 一)實例變量/屬性聲明靜態語言 二)基於原型的編程(至少如果你 記得類一個對象本身)。這可以讓開發人員輕鬆掌握 的靜態或js背景。

  • 個人而言,我很確定正常經典的DSL,雖然普通認爲是 一個DSL是太多的開銷,平均程序員學習,提供 的文檔通常是稀缺的,並且任何改變DSL設計可能 需要高於平均水平的技能,因此OO建模在企業軟件 開發中效果最佳。

+0

這不完全是我問的。通常屬性是在'__init__'中聲明的,這種方法有它的名字嗎? – aisbaa

+1

屬性在__init__中設置,沒有真正定義...可能是ORM類模型定義... Class(y)DSL ...聲明式的類級別建模?有些手冊將其稱爲「在SQLAlchemy或Django等其他流行的ORM中可見的聲明式風格。」 http://docs.peewee-orm.com/en/latest/peewee/models.html – Serge

+1

可能會刪除ORM表單的附加形式。然而,仍然所有的例子都是一些模型轉換聲明式API。我敢打賭,除了API和模型轉換之外,很少需要這種模式(來自超類+聲明屬性的構造函數/初始化方法inheretance)。所以現在只需聲明式API類/聲明式類屬性。這個短語migth也涵蓋了一個類用於聲明其他類屬性或對象屬性的情況。您可能希望瀏覽幾個動態ORMS,它們充滿了可能適合您需求的奇特術語。 – Serge