【发布时间】:2022-01-16 01:24:51
【问题描述】:
我怎样才能做出这样的事情?
class Form(object, metaclass=...):
pass
class Field(object):
def __init__(self, nested_form_class=None):
self.nested_form_class = nested_form_class
class TaskForm(Form):
children = Field(nested_form_class=TaskForm)
渲染:
NameError: name 'TaskForm' is not defined
错误发生在定义children 属性的行上。
我在元类的__new__ 函数中使用了类属性,我无法将其移动到当前类的__init__ 函数中。
我的元类(就像在 django 框架中一样):
class FormMeta(type):
"""
Meta class for extract fields from model
"""
def __new__(mcs, name, bases, attrs):
found_fields = dict()
for k, v in attrs.items():
if isinstance(v, Field):
found_fields[k] = v
attrs['found_fields'] = found_fields
new_class = super().__new__(mcs, name, bases, attrs)
parent_fields = {}
for base in reversed(new_class.__mro__):
# Collect fields from base class.
if hasattr(base, 'found_fields'):
parent_fields.update(base.found_fields)
# Disable reordered fields.
for attr, value in base.__dict__.items():
if value is None and attr in parent_fields:
parent_fields.pop(attr)
new_class.base_fields = parent_fields
new_class.found_fields = parent_fields
return new_class
【问题讨论】:
-
你能继承原来的元类吗?
-
另外,您介意向我们展示一下元类的定义吗?
-
@DanielWalker ,我添加了元类。谢谢!是的。我可以更改元类。我正在为我的项目开发新的表单库。
-
你不能引用一个还不存在的类,但你可以给它类名,并在它第一次使用时从名字中获取类? IE。
getattr(sys.modules[module_name], classname)如果必须的话。但是,如果在类完成之前发生这种情况,您仍然会遇到令人讨厌的问题,这可能是因为您无法控制Field构造函数。您实际上想解决什么问题? -
@Grismar,我想为自定义表单库创建方便的代码。该表单可以使用递归呈现模型字段。我希望儿童模型使用相同的表单类来创建子子表单。我将在实例化时使用表单类属性。我想我可以从模块中按名称获得真正的课程。我想了=)谢谢。