gpt4 book ai didi

python - 使用字典访问 Python 中类的嵌套实例

转载 作者:行者123 更新时间:2023-11-28 20:09:55 25 4
gpt4 key购买 nike

我正在尝试在嵌套类中定义一个属性,然后稍后使用字符串或字符串列表访问它。这是我正在尝试做的代码

class MyNestedClass(object):
def __init__(self):
self.att1 = 5.

class MyClass(object):
def __init__(self):
self.my_nested_inst = MyNestedClass()

my_inst = MyClass()

当我只有这样一个列表时,我想更改 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]]

这可行,但问题是我需要将它扩展到任意深度的嵌套实例。我想不出用 for 循环来完成这项工作的好方法。任何帮助是极大的赞赏。

另请注意,将字符串转换为全局命名空间中的变量名已得到很好的解决,但似乎没有一个答案适用于此。

EDIT1:我会尝试解释我为什么要这样做,如果我解释得不好请告诉我。我正在使用 scipy.optimize.fmin,并且我一直只使用 4 个参数进行优化。但是,我现在想扩展我的优化代码以处理任意数量的参数,其中一些参数是类/实例层次结构中几层的嵌套属性。我希望能够在顶层创建一个列表或字典来告诉 fmin 如何解压参数数组以设置嵌套属性。

最佳答案

您可以使用 operator.attrgetter通过指定包含点的属性名称来获取嵌套属性(需要 Python 2.6+):

After f = attrgetter('date.month'), the call f(b) returns 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)

这是一个完整的示例(使用 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.)

关于python - 使用字典访问 Python 中类的嵌套实例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9523934/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com