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

3zwtqj6y  于 2022-12-30  发布在  Go
关注(0)|答案(9)|浏览(266)

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

x6492ojm

x6492ojm1#

您可以使用内置类型函数:

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

但是在这个特定的例子中(Django模板的数据对象),你应该使用@Xion的解决方案。

qyswt5oh

qyswt5oh2#

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

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

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

uujelgoq

uujelgoq3#

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

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

test_obj.a
test_obj.b()
twh00eeo

twh00eeo4#

使用collections.namedtuple

sigwle7e

sigwle7e5#

使用建筑功能类型:文件

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

第一和第二X相同

vohkndzv

vohkndzv6#

这里有一个创建object. A class is an object的极简方法,所以只要像调用Pythonobject literal一样调用类定义语法即可:

class testobj(object):
    test = [a1,a2,b2]
    test2 = 'something else'
    test3 = 1

类变量是对象的成员,很容易引用:

assert testobj.test3 == 1

这很奇怪,一个类从来没有作为一个类使用:它永远不会示例化。但这是一种创建一个特别的单例对象的简单方法:类本身就是您的对象。

v8wbuo2f

v8wbuo2f7#

为了完整起见,还有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']
yc0p9oo0

yc0p9oo08#

如果您只需要一个“QuickRecord”,则可以简单地声明一个空类
你不用示例化对象就可以使用它...
(just抓住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 )
ddarikpa

ddarikpa9#

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

>>>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'

相关问题