gpt4 book ai didi

python - 如何调用 python 声明属性模式

转载 作者:行者123 更新时间:2023-11-28 17:17:15 25 4
gpt4 key购买 nike

允许将对象实例变量定义为类变量的模式的名称是什么?

通常 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 和许多其他包允许类级变量声明/强加实例类型变量、强化行为、转换。 我认为这种模式没有单一的正式名称,但通常称为:

  • 声明式类 API
  • 声明类定义
  • 声明式 API 类
  • 声明类属性
  • 现代类 DSL

请注意,术语“设计模式”是在“真正的”OOP 语言(例如 Java 和 Smalltalk)的上下文中定义的,作为处理某些缺点的一种方式,不一定适用于特定于 Python 的解决方案。例如,函数式程序员否认工作设计模式适用于函数式编程(因为它完全没有任何缺点:)因此,这里很可能没有声明性属性的正式名称。也许,“惯用的”Python 类 DSL 可能比“模式”更好。

虽然此类 API 提供其他控件,例如不同的父类、 Hook 等,但最显着的特征是使用类变量来模拟类似命名的实例变量。

现代类 DSL API 通常用于 model transformation , Active-Record 或 Data-Mapper 模式,但也不限于此。

Django 是Active-Record 实现的经典例子,由3 定义作为 f

The active record pattern is an approach to accessing data in adatabase. A database table or view is wrapped into a class. Thus, anobject instance is tied to a single row in the table... The wrapper classimplements accessor methods or properties for each column in the table orview.

这种“神奇的”声明式面向类 API 包所基于的技术称为元编程。甚至 Python 也没有任何方法可以开箱即用地声明对象或类变量,它提供了通过元编程、特定 DSL API 创建此类声明的方法,它被 Django、SQL Alchemy、Elastic Search 等利用,通常使用类变量。虽然类变量 DSL 最常用于其他模型/格式的对象序列化,但旨在改进和“de dunder ifying”Python OOP 的通用类声明包并不是闻所未闻,例如https://github.com/python-attrs/attrs

一些旁注:

  • 现代类 API DSL 类似于a) 实例变量/属性声明静态语言b) 基于原型(prototype)的编程(至少如果你回想一下,类本身就是一个对象)。这使得它很容易掌握对于具有一些静态或 js 背景的开发人员。

  • 就我个人而言,我对普通的经典 DSL 没意见,尽管人们普遍认为DSL 对于普通程序员来说学习起来开销太大,前提是文档通常很少,对 DSL 设计的任何更改都可能需要高于平均水平的技能,因此 OO 建模在企业软件中最有效发展。

关于python - 如何调用 python 声明属性模式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43545326/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com