如何在Python中动态创建对象?
我想知道在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']
。这里不需要专门的类。