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

29 投票
9 回答
23607 浏览
提问于 2025-04-17 08:42

我想知道在Python中如何动态创建对象。我经常需要把信息传递给我的Django模板,格式通常是这样的:

{'test': [a1, a2, b2], 'test2': 'something else', 'test3': 1}

这样会让模板看起来很乱。所以我觉得最好是创建一个对象,像这样:

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

这样我就可以这样做:

{{ testobj.test }}
{{ testobj.test2 }}
{{ testobj.test3 }}

而不是直接调用字典。

因为我只需要这个对象一次,能不能不先写一个类就直接创建它?有没有什么简便的方法?这样做可以吗,还是说这是不好的Python写法?

9 个回答

29

Python 3.3+ 中,还有另外一个解决方案,就是使用 types.SimpleNamespace

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

test_obj.a
test_obj.b()
34

你可以使用内置的 type 函数

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

不过在这个特定的情况下(针对Django模板的数据对象),你应该使用 @Xion 的解决方案。

27

在Django模板中,使用点号表示法(比如testobj.test)其实可以和Python中的[]操作符相互转换。这意味着你只需要一个普通的字典就可以了:

testobj = {'test':[a1,a2,b2], 'test2':'something else', 'test3':1}

把它作为testobj变量传递给你的模板后,你就可以在模板里随意使用{{ testobj.test }}这样的表达式。这些表达式会被转换成testobj['test']。这里不需要专门的类。

撰写回答