gpt4 book ai didi

python - 如何从 python 中的给定文本创建一组类及其变量和方法

转载 作者:太空宇宙 更新时间:2023-11-04 04:03:49 25 4
gpt4 key购买 nike

我想从给定的文本配置创建一组类、它的变量和方法,尤其是使用 Django 模型,例如我有一个模型列表要在 models.py 中创建

     classes=["users", "posts", "commnets"]
vars= [{"a","b"},{"bb","vv"},{"aa"}]
#methods=[{....},{....},{....}] not now

在模型.py我想做这样的事情来创建类

for  i,j in zip(classes,vars):
create_classes_from_string(i,j)

我如何编写#create_classes_from_string 以确保它使用该配置在我的数据库中创建表

最佳答案

我可以从两个角度看这个问题

  1. 动态创建python类的正常方式
  2. 专门创建动态 Django 模型

但在这两种情况下,属性都应定义为具有变量名及其值的字典。因为在这里定义一个没有值的变量是没有意义的。

1。动态创建python类的正常方式

这里我们可以简单的使用type()方法来生成一个python类。这可以稍后用于通过将它们添加到 locals() 内置函数来创建具有自己名称的对象。

例子如下

classes = ["Class1", "Class2"]

class_fileds = [
{
'cl1_var1': "test",
'cl1_var2': 123,
},
{
'cl2_var1': [1, 2, 3],
}
]

classes_details = list(zip(classes, class_fileds)) # Python3 format

for class_details in classes_details:
class_name = class_details[0]
class_attrs = class_details[1]
class_def = type(
class_name,
(object, ), # Base classes tuple
class_attrs
)
locals().update({class_name: class_def}) # To associate the class with the script running

instance1 = Class1()
instance2 = Class2()

输出

>>> instance1 = Class1()
>>> instance2 = Class2()
>>>
>>> instance1.cl1_var1
'test'
>>> instance1.cl1_var2
123
>>> instance2.cl2_var1
[1, 2, 3]

这里,列表中的类名称,classes = ["Class1", "Class2"],可以按给定的方式使用,即 Class1()、Class2() 等。这是通过添加变量 Class1 和 Class2 来实现的通过使用 local() 内置函数动态地运行脚本

2。专门创建动态django模型

即使基本逻辑保持不变,也需要进行一些更改。

首先我们需要了解Django中的动态模型创建。 Django 对此提供了清晰的文档。

请引用,https://code.djangoproject.com/wiki/DynamicModels

示例如下,您可以直接将以下脚本添加到models.py文件中

from django.db import models
from django.db.models import CharField, IntegerField

# This is taken from https://code.djangoproject.com/wiki/DynamicModels#Ageneral-purposeapproach
def create_model(name, fields=None, app_label='', module='', options=None, admin_opts=None):
class Meta:
pass

if app_label:
setattr(Meta, 'app_label', app_label)

if options is not None:
for key, value in options.iteritems():
setattr(Meta, key, value)
attrs = {'__module__': module, 'Meta': Meta} # Set up a dictionary to simulate declarations within a class

if fields: # Add in any fields that were provided
attrs.update(fields)
model = type(name, (models.Model,), attrs) # Create the class, which automatically triggers ModelBase processing

return model


classes = ["Class1", "Class2"]

class_fileds = [
{
'cl1_var1': CharField(max_length=255),
'cl1_var2': IntegerField(),
},
{
'cl2_var2': IntegerField(),
}
]

models_details = list(zip(classes, class_fileds))

for model_detail in models_details:
model_name = model_detail[0]
model_attrs = model_detail[1]

model_def = create_model(
model_name,
fields=model_attrs,
app_label=__package__,
module= __name__,
)

locals()[model_name] = model_def

django shell 的输出

>>> from my_app.models import Class1
>>> Class1(cl1_var1="Able to create dynamic class", cl1_var2=12345).save()
>>> Class1.objects.all().values()
<QuerySet [{'cl1_var1': 'Able to create dynamic class', 'id': 3, 'cl1_var2': 12345}]>

此模型已添加到 django 应用程序 my_app 中,它可以正常工作,但有几点需要注意

  1. 当您要从文本文件中读取字段属性时,应小心处理
  2. 应使用 locals() 添加模型以从应用中导入模型
  3. 方法,create_model 应该取自引用链接,因为它支持更多功能,如添加管理页面等
  4. 数据迁移也适用于这种模型

我的建议

上面解释的方法可以毫无问题地工作,并且所有这些方法都受支持,但不要忘记一件事,动态导入类和实际导入存在性能差异。此外,这是一个有点复杂的结构,代码中的任何更改都应该非常小心,不要破坏它。

所以我的建议是读取带有配置的文本文件并使用一些魔法脚本(也可以在 python 中创建)从配置文件生成 models.py 文件。因此,每次文本配置文件发生变化时,您都必须生成 models.py 脚本。这样您还可以确保模型定义

关于python - 如何从 python 中的给定文本创建一组类及其变量和方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57742101/

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