Python调用random获取名称后访问对应类实例age属性报错原因及解决
报错原因分析
- 第一,
random.choices()方法的返回值是列表类型,哪怕参数k=1也会返回仅有一个元素的列表,列表本身没有age属性。 - 第二,你随机选择的数据源是字符串列表
names,就算取出单个元素也是'Bob'这类字符串,和你后续定义的Bob、Robert、Tom这几个People类实例没有关联,字符串类型本身也不存在age属性。 - 额外的顺序问题:你先执行了随机选择逻辑,后定义
People类和对应的实例,就算要把字符串映射到实例,执行随机选择时实例还未创建,也无法获取属性。
修复方案
建议直接把随机选择的数据源替换为People类的实例列表,省去字符串到实例的映射步骤,根据你需要返回单个结果还是多个结果,可以选择两种写法:
方案1:随机返回1个对象,直接读取age属性
要保留权重配置的前提下选单个对象,用random.choices取返回列表的第一个元素即可:
import random class People: def __init__(self, age, city): self.age = age self.city = city # 先创建类实例 Bob = People('23', 'NewYork') Robert = People('73', 'Boston') Tom = People('43', 'Oslo') # 随机选择的数据源直接用实例列表 people_list = [Bob, Robert, Tom] # 带权重选单个元素,取返回列表的第一位 result = random.choices(people_list, weights=[5, 10, 12], k=1)[0] print(result.age)
方案2:保留随机返回1~3个对象的逻辑,遍历读取属性
如果原本的需求就是要返回多个结果,遍历列表逐个读取属性即可:
import random class People: def __init__(self, age, city): self.age = age self.city = city Bob = People('23', 'NewYork') Robert = People('73', 'Boston') Tom = People('43', 'Oslo') people_list = [Bob, Robert, Tom] results = random.choices(people_list, weights=[5, 10, 12], k=random.randint(1, 3)) # 遍历列表读取每个实例的age属性 for res in results: print(res.age)
内容的提问来源于stack exchange,提问作者Agora99
相关产品推荐
相关产品推荐

