You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.29 23:54:03