【问题标题】:Declaring class name in variable在变量中声明类名
【发布时间】:2021-12-29 08:36:28
【问题描述】:

我正在构建一个项目,我试图在声明变量之前在变量中声明类的名称。

但是当我声明像这样的变量时:-

klassName = MyClass

class klassName(models.Model):
    title = models.CharField(max_length=30)

那么它是用KlassName 分配的,而不是我引用它的变量。

然后我试过了:-

className = 'MyClass'
klass = type(className, (object,), {'msg': 'foobarbaz'})
x = className()

class x():
    title = models.CharField(max_length=30)

它正在显示

NameError: name 'className' 未定义

我没有找到任何声明的文档。

我确实按照This 关注了。但似乎没有一个对我有用。

任何帮助将不胜感激。提前谢谢你。

【问题讨论】:

  • 你想要的输出是什么?名称动态来自字符串的模型?
  • 我只是想在声明类之前将类名分配给变量。
  • 但是为什么呢?如果类名来自字符串但您还没有解释为什么需要这样做,则对 type 的三个参数调用是正确的方法
  • three argument call 是什么意思?当然,类名将来自字符串
  • 使用三个参数调用type 可以创建一个具有来自字符串的动态名称的类。但是这样做比较复杂,有必要吗?

标签: python django class django-models


【解决方案1】:

要动态创建一个类,您可以使用type 的三参数形式。要动态创建具有相同名称的变量或模块成员,您可以使用globals() 动态创建变量

globals()['className'] = type('className', (object,), {'foo': 'bar'})

动态创建模型可能稍微复杂一些,但您可以使用抽象基类来定义所有字段/方法以方便使用

class Base(models.Model):
    foo = models.CharField(max_length=100)

    class Meta:
        abstract = True

globals()['className'] = type('className', (Base, ), {'__module__': Base.__module__})

【讨论】:

  • 但是我怎样才能将它与class 一起使用呢?
  • @Van 不确定您的意思?如果您想创建一个具有动态名称的类,那么使用 class 语句实际上是行不通的
  • 你能解释一下为什么会产生问题或为什么会不好吗?
  • @Van 为什么尝试使用class 创建具有动态名称的类会产生问题或不好?
  • 是的。你能说出为什么会产生问题吗?
【解决方案2】:

在你的例子中:

klassName = MyClass

class klassName(models.Model):
    title = models.CharField(max_length=30)

klassName 没有引用任何内容,因为未定义 MyClass。 你可以说:

MyClass = klassName

class klassName(models.Model):
    title = models.CharField(max_length=30)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-03-09
    • 2023-03-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多