如何在python中动态创建对象?

Jas*_*nTS 15 python django object

如何在Python中动态创建对象?我经常想把信息传递给我的Django模板,格式如下:

{'test': [a1, a2, b2], 'test2': 'something else', 'test3': 1}
Run Code Online (Sandbox Code Playgroud)

这使模板看起来不整洁.所以我认为最好只创建一个对象,如:

class testclass():
    self.test = [a1,a2,b2]
    self.test2 = 'someting else'
    self.test3 = 1
testobj = testclass()
Run Code Online (Sandbox Code Playgroud)

所以我可以这样做:

{{ testobj.test }}
{{ testobj.test2 }}
{{ testobj.test3 }}
Run Code Online (Sandbox Code Playgroud)

而不是调用字典.

因为我只需要一次该对象,是否可以在不先写一个类的情况下创建它?有没有简写代码?可以这样做,还是糟糕的Python?

num*_*er5 26

您可以使用内置类型功能:

testobj = type('testclass', (object,), 
                 {'test':[a1,a2,b2], 'test2':'something else', 'test3':1})()
Run Code Online (Sandbox Code Playgroud)

但在这种特殊情况下(Django模板的数据对象),您应该使用@ Xion的解决方案.

  • 请不要这样做.简单比复杂更好. (5认同)
  • @number5 如果您还建议不要使用此代码,我会投票支持您的答案!(至少不是针对这种特定情况) (3认同)

Xio*_*ion 23

在Django模板中,点符号(testobj.test)可以解析为Python的[]运算符.这意味着你需要的只是一个普通的词典:

testobj = {'test':[a1,a2,b2], 'test2':'something else', 'test3':1}
Run Code Online (Sandbox Code Playgroud)

将其作为testobj变量传递给您的模板,您可以在模板中自由使用{{ testobj.test }}和使用类似的表达式.他们将被翻译成testobj['test'].这里不需要专门的课程.


t_i*_*_io 11

Python 3.3+中还有另一个解决方案 types.SimpleNamespace

from types import SimpleNamespace
test_obj = SimpleNamespace(a=1, b=lambda: {'hello': 42})

test_obj.a
test_obj.b()
Run Code Online (Sandbox Code Playgroud)