我想在Python中创建一个动态对象(在另一个对象内部),然后向其添加属性。
我试着:
obj = someobject
obj.a = object()
setattr(obj.a, 'somefield', 'somevalue')
但这并不奏效。
什么好主意吗?
编辑:
我设置的属性从一个循环通过一个值的列表,例如。
params = ['attr1', 'attr2', 'attr3']
obj = someobject
obj.a = object()
for p in params:
obj.a.p # where p comes from for loop variable
在上面的例子中,我会得到obj.a。attr1, obj.a。attr2 obj.a.attr3。
我使用了setattr函数,因为我不知道如何从for循环中执行obj.a.NAME。
如何根据上面例子中的p值设置属性?
有关为什么它不起作用的详细信息,请参见不能在“object”类的实例上设置属性。
今天晚了,但这是我的一文不值的一个对象,恰好在应用程序中保存了一些有用的路径,但你可以将它用于任何你想要的信息字典,你可以通过getattr和点符号访问(这是我认为这个问题真正的问题):
import os
def x_path(path_name):
return getattr(x_path, path_name)
x_path.root = '/home/x'
for name in ['repository', 'caches', 'projects']:
setattr(x_path, name, os.path.join(x_path.root, name))
这很酷,因为:
In [1]: x_path.projects
Out[1]: '/home/x/projects'
In [2]: x_path('caches')
Out[2]: '/home/x/caches'
所以这使用函数对象像上面的答案,但使用函数来获取值(你仍然可以使用(getattr, x_path, 'repository'),而不是x_path('repository'),如果你喜欢的话)。
如果我们可以在创建嵌套对象之前确定并聚合所有属性和值,那么我们可以创建一个新类,在创建时接受dictionary参数。
# python 2.7
class NestedObject():
def __init__(self, initial_attrs):
for key in initial_attrs:
setattr(self, key, initial_attrs[key])
obj = someobject
attributes = { 'attr1': 'val1', 'attr2': 'val2', 'attr3': 'val3' }
obj.a = NestedObject(attributes)
>>> obj.a.attr1
'val1'
>>> obj.a.attr2
'val2'
>>> obj.a.attr3
'val3'
我们还可以允许关键字参数。请看这篇文章。
class NestedObject(object):
def __init__(self, *initial_attrs, **kwargs):
for dictionary in initial_attrs:
for key in dictionary:
setattr(self, key, dictionary[key])
for key in kwargs:
setattr(self, key, kwargs[key])
obj.a = NestedObject(attr1='val1', attr2='val2', attr3= 'val3')