使用dict访问Python中嵌套的类实例

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如何解压缩参数数组以设置嵌套属性.

Gre*_*egg 6

您可以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)