首页 > 解决方案 > 如何遍历类实例

问题描述

嗨,我正在尝试解决一个简单的问题,但我不知道如何遍历类实例,即

class element :
    def __init__(self, a, s, m):
        self.name = a ;
        self.symbol = s;
        self.atomic_mass = m ;

class correction :
    def __init__(self, a, atr, v):
        self.name = a ;
        self.atribute = atr;
        self.correct_value = v ;

nitrogen = element("Nitrogen", "N", 12)

correction1 = correction("Nitrogen", "atomic_mass", 14)

我想做的就是找出课堂上是否有“atomic_mass”,如果有的话,把它改成14。我现在正试图弄清楚这个。

当然最后会有一个元素列表=[氮、碳、氦、氧等],我需要找到正确的一个并改变它的值。

到目前为止,我有这个:

def correct(elements, correction):
    for i in elements:
        for j in correction:
           if i.a == j.a:

...

标签: loopsclassinstance-variables

解决方案


您可以使用setattr()内置方法。例如:

class a:
   def __init__(self, a: str, b: str):
       this.a = a
       this.b = b

inst = a("str1", "str2")

setattr(inst, "a", "new_string_1")

或者干脆inst.a = "new_string_1"

编辑

  • 检查类是否具有属性,您可以使用hasattr内置方法
  • 迭代类道具使用dir内置方法

编辑

最后,如果你有类列表,你可以编写更正方法,它需要一个元素列表和更正规则列表。例如:

correction_rules = [
    {"attr": "atomic_mass", "search": 1, "change_to": 2}, 
    {"attr": "Name", "search": 1, "change_to": 2}
]

def correct(objects, rules):
    for obj in objects:
        for rule in rules:
            if hasattr(obj, rule["attr"]) and \
                getattr(obj, rule["attr"]) == rule["search"]:
                setattr(obj, rule["attr"], rule["change_to"])

correct(your_list_of_objects, correction_rules)

推荐阅读