如何在python中按名称设置属性的属性?

2024-05-16 09:05:54 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一段代码,其中我有一个对象B,它有另一个对象A作为属性,我希望用户能够按名称设置任一对象的属性。如何让用户设置AB的属性

以下代码说明了我正在尝试执行的操作:

>>> class A:
...     def __init__(self):
...             self.asd = 123
>>> class B:
...     def __init__(self, a):
...             self.a = a
>>> a=A()
>>> b=B(a)
>>> b.a.asd
123
>>> setattr(b, 'a.asd', 1000)
>>> b.a.asd
123         # I would like this to be 1000

我只想提示用户输入属性名称和值

我用以下代码提示用户:

prop = input("Property name to set: ")
try: 
    print(f"Current value of property {prop}: {getattr(B, prop)}")
    value = input("Property value to set: ")
    setattr(B, prop, value)
except AttributeError:
    print(f"Object {B} has no property named {prop}. See {dir(B)}")

编辑:问题已解决,但我在两天内无法接受自己的答案


Tags: to对象代码用户self名称input属性
2条回答

无法使用setattr()中的属性名称遍历对象。因此,要模拟这种行为,可以在.上拆分属性名称,并使用getattr()选择要在其上设置属性的对象。这样,您只需要提示用户输入属性名称和值

prop = input("Property name to set: ")
obj_to_set = B
try:
    for i in prop.split(".")[:-1]:
        obj_to_set = getattr(obj_to_set, i)
    prop_name = prop.split(".")[-1]
    print(f"Current value of property {prop_name}: {getattr(obj_to_set, prop_name)}")
    value = input("Property value to set: ")
    setattr(obj_to_set, prop_name, value)
except AttributeError:
    print(f"Object {obj_to_set} has no property named {prop}. See {dir(obj_to_set)}")
setattr(getattr(b, 'a'), 'asd', 1000)

相关问题 更多 >