Python中数组存储类实例后,如何访问类变量?
解决Python类实例数组访问实例属性的问题
嘿,我来帮你搞定这个问题!咱们先拆解一下你代码里的两个核心问题:
问题1:数组里存的是类,不是实例
你写的p = [apixel] * 10其实是把apixel这个类本身重复了10次放进数组里,数组里的每个元素都是类对象,而不是类的实例。这就是为什么你调用obj.do_i_exist()暂时能运行(因为你是直接调用类的方法),但访问obj.posx会失败——posx是实例属性,只有当你创建类的实例(也就是调用apixel())时才会被初始化。
问题2:实例方法缺少self参数
你的do_i_exist方法没有定义第一个参数self,这不符合Python实例方法的规则。实例方法必须把实例本身作为第一个参数(惯例叫self),如果是直接用类调用这个方法,虽然暂时没报错,但这不是正确的写法,后续如果用实例调用就会出问题。
修正后的完整代码
import random # 别忘了导入random模块,不然randint会报错 class apixel(object): def __init__(self): self.posx = random.randint(0, 300) self.posy = random.randint(0, 200) def do_i_exist(self): # 加上self参数 print("Yes i do!") # 创建10个类实例,用列表推导式 p = [apixel() for _ in range(10)] for obj in p: obj.do_i_exist() # 现在是调用实例的方法 print(obj.posx) # 正常访问实例属性posx
关键变化说明
- 用
[apixel() for _ in range(10)]替代[apixel] *10:每次循环都会调用apixel()创建一个新的实例,这样数组里的每个元素都是独立的类实例,各自拥有自己的posx和posy。 - 给
do_i_exist方法添加self参数:让它成为标准的实例方法,这样无论是实例调用还是后续扩展都不会出问题。
内容的提问来源于stack exchange,提问作者markop
相关产品推荐
相关产品推荐

