如何在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?
答案 0 :(得分:25)
您可以使用内置type function:
testobj = type('testclass', (object,),
{'test':[a1,a2,b2], 'test2':'something else', 'test3':1})()
但在这种特殊情况下(Django模板的数据对象),您应该使用@ Xion的解决方案。
答案 1 :(得分:23)
在Django模板中,点表示法(testobj.test
)可以解析为Python的[]
运算符。这意味着你所需要的只是一个普通的词典:
testobj = {'test':[a1,a2,b2], 'test2':'something else', 'test3':1}
将其作为testobj
变量传递给您的模板,您可以在模板中自由使用{{ testobj.test }}
和类似的表达式。它们将被翻译为testobj['test']
。这里不需要专门的课程。
答案 2 :(得分: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()
答案 3 :(得分:9)
答案 4 :(得分:1)
答案 5 :(得分: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'
答案 6 :(得分:0)
如果您想要一个对象,则只能使用一次...
class testobj(object):
test = [a1,a2,b2]
test2 = 'something else'
test3 = 1
...类也是对象。
assert testobj.test3 == 1
这很奇怪,一个类从未用作类。从未创建testobj
“类”的实例化。但这是制作临时单例对象的一种简洁的方法:类本身就是对象。它的类成员很容易被引用。
答案 7 :(得分:0)
出于完整性考虑,还有recordclass
:
from recordclass import recordclass
Test = recordclass('Test', ['test', 'test1', 'test2'])
foo = Test(test=['a1','a2','b2'], test1='someting else', test2=1)
print(foo.test)
.. ['a1', 'a2', 'b2']
答案 8 :(得分:0)
如果你只需要一个“QuickRecord”,你可以简单地声明一个空类
并且您可以使用它而无需实例化对象...
(抓住python语言的动态特性...“á la Javascript”)
# create an empty class...
class c1:pass
# then just add/change fields at your will
c1.a = "a-field"
c1.b = 1
c1.b += 10
print( c1.a, " -> ", c1.b )
# this has even the 'benesse' of easealy taking a
# snapshot whenever you want
c2 = c1()
print( c2.a, " -> ", c2.b )