【问题标题】:How to set a property of a property by name in python?如何在python中按名称设置属性的属性?
【发布时间】:2020-09-14 02:32:55
【问题描述】:

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

以下代码说明了我正在尝试做的事情:

>>> 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)}")

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

【问题讨论】:

  • 也许:setattr(b.a, 'asd', 1000) ?
  • 我无法提示用户输入b.a。我希望用户能够设置 A 和 B 的属性。为了清楚起见,更新了问题。
  • 'a.asd' 是一个字符串。 setattr 不会解释 '.'不仅仅是一个时期。在您的示例中, b 是一个对象。 b.a 是一个不同的对象。 setattr 需要确切的对象作为其第一个参数 - 请参阅@Mark Meyer 的先前评论
  • 可以分享一下用户提示码吗?
  • 用提示码更新问题。

标签: python properties


【解决方案1】:
setattr(getattr(b, 'a'), 'asd', 1000)

【讨论】:

  • 如何提示用户输入此信息?我希望用户能够设置 A 和 B 的属性
  • 你提示用户这个,就像你提示用户任何输入一样。你被困在哪里了?您现在似乎要求我们为您做一些设计和编码;这与 Stack Overflow 无关。
  • @TheBicPen 通常,您应该从用户输入中抽象出编程细节。
【解决方案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)}")

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-12-22
    • 2017-03-02
    • 2018-05-22
    • 2012-03-13
    • 2021-10-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多