【问题标题】:How to change the values of instance attributes in a loop如何在循环中更改实例属性的值
【发布时间】:2021-12-07 23:51:20
【问题描述】:

我有一个 python 的工作植入,它有一些内置的对话框,所以我不能在这里分享原始代码。我遇到的问题是我想更新一些实例属性的值。我通过将 2 个列表压缩在一起制作了一个字典,以便在 for 循环中我可以向用户提及他们需要查看的字符串以了解他们正在更新的内容(字典键),而我想要更改的实例属性是值字典中的。但它所做的只是改变字典值,而不是实例属性值。

对话框将询问用户“您要更改 json 文件中的 {x relayed name} 吗?”。字典中与该名称关联的值是要更新的实例属性。

所以不知道能不能做到。如果可以的话,有人有什么想法吗?

在优秀的 cmets 明确问题写错后更新问题。

代码

class MyClass:

    def __init__(self):
        self.x = 10.0
        self.y = 20.0

    def get_user_input(self):
        usr_ret = input("input a number :")
        return usr_ret


if __name__ == "__main__":
    m = MyClass()
    print(m.x)
    list_a = ["x_related_name", "y_related_name"]
    list_b = [m.x, m.y]
    mydict = dict(zip(list_a, list_b))
    for k, v in mydict.items():
        print(k, " : ", v)

    # update the class attribute value
    for k, v in mydict.items():

    
    #Can I update the class attributes x and y in a loop?

【问题讨论】:

  • 你可以用 m.x 和 m.y 分配、修改、做任何你喜欢的事情,尽管在类中实现函数(getter、setter 等)更好
  • 这个问题的任何地方都没有类属性。与您似乎所指的实例属性一样,为什么要循环?您在您的 dict 中命名了可以直接访问的键。从您在此处显示的 sn-p 来看,dict 和循环的全部意义并不明显。
  • @BrutusForcus:“类(getters、setters 等)是更好的风格”对于 Python 来说是不正确的。
  • 我假设您想更改类 instance 属性,而不是类属性。在本例中,实例为 m,因此您需要为实例的 m.xm.y 值分配新值以更改它们。
  • 我已经更新了问题以反映实例属性而不是类属性,为混淆道歉,我是自学的,还在学习。

标签: python class dictionary for-loop


【解决方案1】:

您想要getattrsetattr 吗?在下文中,我简化了示例,因为我找不到在您的示例中使用用户输入的位置。

getattr 根据属性名称获取属性值,setattr 将值设置为指定属性(同样,根据其名称)。因此,您只需将属性名称存储在字符串列表中,并根据需要在列表中循环。

class MyClass:
    def __init__(self):
        self.x = 10.0
        self.y = 20.0

if __name__ == "__main__":
    m = MyClass()
    attrs = ['x', 'y']
    for a in attrs:
        print(f"{a}: {getattr(m, a)}")
    set_as = [42, 2021]
    for a, v in zip(attrs, set_as):
        setattr(m, a, v)
    for a in attrs:
        print(f"{a}: {getattr(m, a)}")

【讨论】:

  • 我可以看到它有效,将尝试使其适应我的问题。我第一次看到 getattr 和 setattr。
猜你喜欢
  • 2022-06-12
  • 2020-04-05
  • 1970-01-01
  • 2023-01-01
  • 1970-01-01
  • 2021-12-17
  • 1970-01-01
  • 1970-01-01
  • 2013-03-21
相关资源
最近更新 更多