2017-04-21 5 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クラス
  • 宣言クラスの属性
  • 、このようなAPIは、OT提供

ながら現代のクラスのDSL異なる親クラス、フックなどのコントロールは、同様の名前のインスタンス変数をモデル化するためのクラス変数の使用です。

モダンクラスのDSL APIは、通常、アクティブレコードまたはデータマッパーのパターンmodel transformationで使用されますが、これに限定されません。

このような「魔法の」宣言的クラス指向のAPIパッケージは、メタプログラミングと呼ばれる手法です。 Pythonにもオブジェクトやクラス変数を宣言する手段はありません。メタプログラミング、Django、SQL Alchemy、Elastic Searchなどで一般的に使われている特定のDSL APIを使って、そのような宣言を作成する手段を提供します変数。クラス変数DSLは他のモデル/フォーマットへのオブジェクト直列化で最もよく使用されますが、一般的なPython OOPの場合、 "dunder ifying"の改善を目指すジェネリッククラス宣言パッケージは知られていません。 https://github.com/python-attrs/attrs

ほとんどサイドノート:

  • 現代のクラスのAPIのDSLは両方 a)はインスタンス変数/属性宣言静的言語 b)はプロトタイプベースに似ている(あなたはそのクラスを思い出す 少なくとも場合でありますオブジェクトそのもの)。これは、いくつかの静的またはjsの背景を持つdevsのために を把握しやすくします。

  • 個人的に共通の DSLを学ぶための平均的なプログラマのためにあまりにも多くのオーバーヘッドで、 ドキュメントを提供したことであることは恒常的に不足している場合、およびDSLの設計への変更は可能性があります 必要と考えているものの、私は、通常の古典のDSLでOKですOOモデリングはエンタープライズソフトウェア 開発で最もよく機能します。

+0

これは私が求めているものではありません。通常、属性は '__init__'で宣言されていますが、このアプローチには名前がありますか? – aisbaa

+1

属性は__init__に設定されていますが、実際には定義されていません... ORMクラスモデル定義...クラス(y)DSL ...宣言的なクラスレベルのモデリング?いくつかのマニュアルでは、「SQLAlchemyやDjangoのような他の一般的なORMで見られる宣言的スタイル」と呼ばれています。おそらくORMを削除するフォームが追加された – Serge

+1

がhttp://docs.peewee-orm.com/en/latest/peewee/models.htmlにあります。それでもなお、すべての例は、いくつかのモデル変換宣言型APIです。私はそのパターン(スーパークラス+宣言属性からのコンストラクタ/イニシャライザ以外のパターン)は、APIやモデル変換以外ではめったに必要ないと確信しています。今すぐ宣言APIクラス/宣言クラス属性。このフレーズマイグレーションは、あるクラスが他のクラス属性またはオブジェクト属性を宣言するために使用される場合もカバーする。いくつかの動的なORMSをブラウズすることができます。これらのORMSは、ニーズに合った専門用語でいっぱいです。 – Serge

関連する問題