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

时间:2011-12-20 13:05:07

标签: python django object

如何在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 个答案:

答案 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)

使用建筑功能类型:document

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

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

答案 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 )