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

问题描述 投票:14回答:6

如何在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?

python django object
6个回答
25
投票

你可以使用内置的type function

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

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


23
投票

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

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

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


10
投票

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

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

test_obj.a
test_obj.b()

9
投票

1
投票

使用建筑功能类型:document

>>> class X:
...     a = 1
...
>>> X = type('X', (object,), dict(a=1))

第一个和第二个X是相同的


0
投票

下面的代码还需要创建一个类,但它更短:

 >>>d = {'test':['a1','a2','b2'], 'test2':'something else', 'test3':1}
 >>> class Test(object):
 ...  def __init__(self):
 ...   self.__dict__.update(d)
 >>> a = Test()
 >>> a.test
 ['a1', 'a2', 'b2']
 >>> a.test2
 'something else'
© www.soinside.com 2019 - 2024. All rights reserved.