如何在python中按名称设置属性的属性?
我有一段代码,其中我有一个对象如何在python中按名称设置属性的属性?,python,properties,Python,Properties,我有一段代码,其中我有一个对象B,它有另一个对象a作为属性,我希望用户能够按名称设置任一对象的属性。如何让用户设置A或B的属性 以下代码说明了我正在尝试执行的操作: >>> class A: ... def __init__(self): ... self.asd = 123 >>> class B: ... def __init__(self, a): ... self.a = a >&g
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: ")
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)}")
我用以下代码提示用户:
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)}")
编辑:问题已解决,但我在两天内无法接受自己的答案无法使用
setattr()
中的属性名称遍历对象。因此,要模拟这种行为,可以在
上拆分属性名称,并使用getattr()
选择要在其上设置属性的对象。这样,您只需要提示用户输入属性名称和值
setattr(getattr(b, 'a'), 'asd', 1000)
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(b.a.,asd',1000)
?但是我不能提示用户输入b.a
。我希望用户能够设置A和B的属性。为了清楚起见,更新了问题。“A.asd”是一个字符串。setattr不会将“.”解释为句点以外的任何内容。在您的示例中,b是一个对象。b、 a是一个不同的对象。setattr需要确切的对象作为其第一个参数-请参阅@Mark Meyer的上一条评论您可以共享用户提示代码吗?用提示代码更新了问题。我如何提示用户输入此信息?我希望用户能够设置A和BYou的属性并提示用户进行此操作,就像提示用户进行任何输入一样。你被困在哪里?你现在似乎要求我们为你做一些设计和编码;这与堆栈溢出无关。@通常,您应该从用户输入中抽象出编程细节。