【发布时间】:2017-10-31 13:44:07
【问题描述】:
以WTForms表单定义类为例:
class RegistrationForm(Form):
username = StringField('Username', [validators.Length(min=4, max=25)])
email = StringField('Email Address', [validators.Length(min=6, max=35)])
accept_rules = BooleanField('I accept the site rules', [validators.InputRequired()])
查看库的源代码,WTForms 似乎允许用户定义一个非常简单的自定义表单结构类(如上),然后用于构造一个新的字段 在生成类时没有实例化的类。
我已经阅读了许多关于类工厂和元类的教程,普遍的共识是避免使用元类,而是使用类装饰器之类的东西。问题是教程要么开始导入额外的库,例如:import six,混合不同 Python 版本的解释,使用过于复杂的示例,或者建议根本不要使用元类。
请有人提供一个非常简单的解释(对于 Python 3),说明如何使用简单的类定义(如上面的 WTForms 示例)以及元类来自定义类的全新构造,而无需实际实例化类构建。
编辑:很抱歉很难解释我的最终目标是什么,但是当我浏览教程时,不清楚类装饰器、元类、魔术方法(调用、new、init) 或这些的组合是我实现我所设想的东西所需要的,或者我所设想的东西是错误的做事方式事物。不幸的是,如果不了解实现目标所需的机制,似乎无法判断我的目标是否错误。我已经意识到元类是要走的路,只需要为一个非常简单的元类示例指明正确的方向,以 Python 3.x 的方式完成。
【问题讨论】:
-
为什么您正在阅读的教程告诉您使用元类是不好的做法?元类有完全有效的用例。如果这就是所有教程所说的,IMO 他们错了。
-
如果您更具体地说明您要完成的工作,参考您所读到的建议元类不符合目的的内容等,这将有所帮助。
-
您是否可以提供一个示例链接来解释为什么不应该使用元类?这似乎不对。
-
我有点怀疑教程实际上所说的是“在你接触元类之前,考虑一下你的元编程问题是否不能用更简单、更受限制的技术(如装饰器)来解决”。而不是“不要使用元类来制作 calasses”。
-
另外——我真的检查了类装饰器覆盖的“90%”用例(或 99%,它只是在飞行中以任何方式制作的)。我不得不在“现实生活项目”中创建一些元类——我认为只有一次类装饰器就足够了。
标签: python python-3.x python-decorators metaclass class-factory