2017-04-21 89 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