如何使用input()生成的变量调用Python类实例的属性
问题说明
如何使用从input()生成的变量调用类实例的属性?我编写的代码中,静态写法print(E3.name)可以正常运行,但如果尝试用变量替换'E3'或者'melt'这类属性名时就会运行失败。
原运行代码:
# 用户输入元素编号和需要查询的属性,从Element类返回对应值 class Element(): def __init__(self, name, atomnum, atomwt, phase, melt, boil, crystal, category, shells, row, period): self.name = name self.atomnum = atomnum self.atomwt = atomwt self.phase = phase self.melt = melt self.boil = boil self.crystal = crystal self.category = category self.shells = shells self.row = row self.period = period E1 = Element("hydrogen", 1, 1.00794, "gas", -259, -253, "n/a", "non-metal", "1", 1, 1) E2 = Element("helium", 2, 4.002602, "gas", -272, -269, "n/a", "nobel gas", "2", 1, 18) E3 = Element("lithium", 3, 6.941, "solid", 181, 1342, "body-centred cubic", "alkali metal", "1,2", 2, 1) E4 = Element("beryllium", 4, 9.012182, "solid",1287, 2469, "hexagonal", "alkaline earth metal", "2,2", 2, 2) elnum = input("Element number eg. E3 ") elattrib = input("Attribute of Element ") print(E3.name, " melting point ", E3.melt, "ºC") # 这行静态代码可以正常输出正确结果,但我想要实现动态输入动态查询 print(elnum.elattrib) # 这行运行报错:AttibuteError: 'str' Object has no attibute 'elattrib'
解决方案
错误根源
input()返回的是字符串类型,你拿到的elnum是类似"E3"的文本值,不是你预先定义的E3实例变量- Python的点语法不支持直接跟字符串类型的属性名,
elattrib是字符串,不能直接写在.后面作为属性调用
修复方案
- 把所有Element实例存入字典,用实例名的字符串作为key,这样可以直接用输入的
elnum字符串取到对应实例 - 用Python内置函数
getattr(实例对象, 属性名字符串)动态获取属性值,同时可以加默认值避免属性不存在时直接崩溃
修改后可运行代码
class Element(): def __init__(self, name, atomnum, atomwt, phase, melt, boil, crystal, category, shells, row, period): self.name = name self.atomnum = atomnum self.atomwt = atomwt self.phase = phase self.melt = melt self.boil = boil self.crystal = crystal self.category = category self.shells = shells self.row = row self.period = period # 用字典存储所有元素实例,方便动态查询 element_map = { "E1": Element("hydrogen", 1, 1.00794, "gas", -259, -253, "n/a", "non-metal", "1", 1, 1), "E2": Element("helium", 2, 4.002602, "gas", -272, -269, "n/a", "nobel gas", "2", 1, 18), "E3": Element("lithium", 3, 6.941, "solid", 181, 1342, "body-centred cubic", "alkali metal", "1,2", 2, 1), "E4": Element("beryllium", 4, 9.012182, "solid",1287, 2469, "hexagonal", "alkaline earth metal", "2,2", 2, 2) } elnum = input("输入元素编号,例如E3:") elattrib = input("输入要查询的元素属性:") # 先从字典取对应实例,再用getattr拿属性 target_element = element_map.get(elnum) if not target_element: print("输入的元素编号不存在") else: attrib_value = getattr(target_element, elattrib, None) if attrib_value is None: print("输入的属性不存在") else: print(f"{target_element.name}的{elattrib}属性值为:{attrib_value}")
内容的提问来源于stack exchange,提问作者Srete23
相关产品推荐
相关产品推荐

