Cha*_*had 2 python namespaces nested-attributes
我试图在嵌套类中定义一个属性,然后使用字符串或字符串列表访问它.这是我正在尝试做的代码
class MyNestedClass(object):
def __init__(self):
self.att1 = 5.
class MyClass(object):
def __init__(self):
self.my_nested_inst = MyNestedClass()
my_inst = MyClass()
Run Code Online (Sandbox Code Playgroud)
我想改变my_inst.my_nested_inst.att1
我所拥有的是一个像这样的列表的值:my_list = ['my_inst','my_nested_inst','att1']
.
如果我用这个:
vars(vars(vars()[my_list[0]])[my_list[1]])[my_list[2]]
Run Code Online (Sandbox Code Playgroud)
这是有效的,但问题是我需要将它扩展到任意深度的嵌套实例.我无法找到一个好的方法来使用for循环工作.任何帮助是极大的赞赏.
此外,请注意,在全局命名空间中将字符串转换为变量名称已得到很好的解决,但这些答案似乎都不适用于此处.
编辑1:我会试着解释为什么我这样做,如果我做的很难解释,请告诉我.我使用scipy.optimize.fmin,我一直只使用4个参数进行优化.但是,我现在想扩展我的优化代码来处理任意数量的参数,其中一些是嵌套属性,在层/实例层次结构中有几层.我希望能够在顶层创建一个列表或字典,告诉fmin如何解压缩参数数组以设置嵌套属性.
您可以operator.attrgetter
通过指定包含点的属性名称来获取嵌套属性(需要Python 2.6+):
之后
f = attrgetter('date.month')
,呼叫f(b)
返回b.date.month
.
为方便起见,您可以创建一对辅助函数:
def get_nested_attr(vars_dict, attrs):
inst = vars_dict[attrs[0]]
return operator.attrgetter('.'.join(attrs[1:]))(inst)
def set_nested_attr(vars_dict, attrs, value):
setattr(get_nested_attr(vars_dict, attrs[0:-1]), attrs[-1], value)
Run Code Online (Sandbox Code Playgroud)
这是一个完整的例子(使用Python 2.7.2测试):
import operator
class MyNestedClass(object):
def __init__(self):
self.att1 = 5.
class MyClass(object):
def __init__(self):
self.my_nested_inst = MyNestedClass()
def get_nested_attr(vars_dict, attrs):
inst = vars_dict[attrs[0]]
return operator.attrgetter('.'.join(attrs[1:]))(inst)
def set_nested_attr(vars_dict, attrs, value):
setattr(get_nested_attr(vars_dict, attrs[0:-1]), attrs[-1], value)
my_inst = MyClass()
my_list = ['my_inst','my_nested_inst','att1']
assert(my_inst.my_nested_inst.att1 == 5.)
set_nested_attr(vars(), my_list, 10.)
assert(my_inst.my_nested_inst.att1 == 10.)
Run Code Online (Sandbox Code Playgroud)