如何调用 python 声明性属性模式
How python declarative attribute pattern is called
允许将对象实例变量定义为 class 变量的模式名称是什么?
通常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()
这个图案叫什么名字?
Django、Elasticsearch DSL 和许多其他包允许 class 级变量到 declare/impose 类型的实例变量、强化行为、转换。 我不认为这种模式有一个正式名称,但通常它被称为:
- 声明式风格ClassAPI
- 声明式Class定义
- 声明式 API Classes
- 声明性Class 属性
- 现代Class DSL
注意术语 'design pattern' 是在“真正的”OOP 语言(例如 Java 和 Smalltalk)的上下文中定义的,作为处理某些缺点的一种方式,而不是适用于特定解决方案的必要条件到 Python。例如,函数式程序员否认工作设计模式适用于函数式编程(因为它完全没有任何缺点:)
因此,这里很可能没有声明性属性的正式名称。也许,“惯用的”Python Class DSL 可能比“模式”更好。
虽然这样的 API 提供其他控件,例如不同的父级 classes、挂钩等,但最显着的特征是使用 class 变量来模拟命名相似的实例变量。
现代 Class DSL API 通常用于 model transformation、Active-Record 或 Data-Mapper 模式,但也不限于此。
Django 是 classactive-Record 实现的 ic 示例,由 3 定义为 f
The active record pattern is an approach to accessing data in a
database. A database table or view is wrapped into a class. Thus, an
object instance is tied to a single row in the table... The wrapper class
implements accessor methods or properties for each column in the table or
view.
这种 'magic' 面向 class 的声明式 API 包所基于的技术称为元编程。即使 Python 没有任何方法来声明对象或开箱即用的 class 变量,它提供了通过元编程、特定 DSL API 创建此类声明的方法,这被 Django 利用、SQL Alchemy、Elastic Search 等,通常使用 class 变量。虽然 class-变量 DSL 最常用于其他 models/formats 的对象序列化,但旨在改进和“dedunderifying" Python OOP in general are not unheard of, e.g. https://github.com/python-attrs/attrs
的通用 class 声明包
一些旁注:
现代 class API DSL 类似于两者
a) 实例variable/attribute声明静态语言
b) 基于原型的编程(至少如果你
回想一下 class 本身就是一个对象)。这使得它很容易掌握
对于具有一些静态或 js 背景的开发者。
就我个人而言,我可以接受普通的 classic DSL,尽管普遍认为
DSL 对于普通程序员来说学习起来开销太大,前提是
文档通常很少,对 DSL 设计的任何更改都可能
需要高于平均水平的技能,因此 OO 建模在企业软件中最有效
发展。
允许将对象实例变量定义为 class 变量的模式名称是什么?
通常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()
这个图案叫什么名字?
Django、Elasticsearch DSL 和许多其他包允许 class 级变量到 declare/impose 类型的实例变量、强化行为、转换。 我不认为这种模式有一个正式名称,但通常它被称为:
- 声明式风格ClassAPI
- 声明式Class定义
- 声明式 API Classes
- 声明性Class 属性
- 现代Class DSL
注意术语 'design pattern' 是在“真正的”OOP 语言(例如 Java 和 Smalltalk)的上下文中定义的,作为处理某些缺点的一种方式,而不是适用于特定解决方案的必要条件到 Python。例如,函数式程序员否认工作设计模式适用于函数式编程(因为它完全没有任何缺点:) 因此,这里很可能没有声明性属性的正式名称。也许,“惯用的”Python Class DSL 可能比“模式”更好。
虽然这样的 API 提供其他控件,例如不同的父级 classes、挂钩等,但最显着的特征是使用 class 变量来模拟命名相似的实例变量。
现代 Class DSL API 通常用于 model transformation、Active-Record 或 Data-Mapper 模式,但也不限于此。
Django 是 classactive-Record 实现的 ic 示例,由 3 定义为 f
The active record pattern is an approach to accessing data in a database. A database table or view is wrapped into a class. Thus, an object instance is tied to a single row in the table... The wrapper class implements accessor methods or properties for each column in the table or view.
这种 'magic' 面向 class 的声明式 API 包所基于的技术称为元编程。即使 Python 没有任何方法来声明对象或开箱即用的 class 变量,它提供了通过元编程、特定 DSL API 创建此类声明的方法,这被 Django 利用、SQL Alchemy、Elastic Search 等,通常使用 class 变量。虽然 class-变量 DSL 最常用于其他 models/formats 的对象序列化,但旨在改进和“dedunderifying" Python OOP in general are not unheard of, e.g. https://github.com/python-attrs/attrs
的通用 class 声明包一些旁注:
现代 class API DSL 类似于两者 a) 实例variable/attribute声明静态语言 b) 基于原型的编程(至少如果你 回想一下 class 本身就是一个对象)。这使得它很容易掌握 对于具有一些静态或 js 背景的开发者。
就我个人而言,我可以接受普通的 classic DSL,尽管普遍认为 DSL 对于普通程序员来说学习起来开销太大,前提是 文档通常很少,对 DSL 设计的任何更改都可能 需要高于平均水平的技能,因此 OO 建模在企业软件中最有效 发展。