Python如何在类构造函数内实现实例自动添加至共享列表?
Python类实例自动添加到列表的实现问题
问题背景
已经通过类内部、构造函数__init__之外定义列表的方式,实现了创建类实例时自动将实例加入列表的功能,代码如下:
class matriculation: students = [] def __init__(self, number): self.number = number matriculation.students.append(self) @classmethod def show(cls): for student in matriculation.students: print(student.number, end= " ") print("\n") def main(): s1 = matriculation(1) s2 = matriculation(2) # 打印学生列表 matriculation.show()
该代码可正常运行,但尝试将列表放在构造函数内部时出现错误type object 'course' has no attribute 'course_li',错误代码如下:
class course: def __init__(self, course): self.course = course self.course_li = [] self.course_li.append(self) def main(): c1 = course("Math") c2 = course("History") # 尝试打印列表但报错 for subject in course.course_li: print(subject.course, end= " ")
希望在构造函数内实现实例自动追加,不想将列表作为实例属性传递,想知道错误原因及可行方案。
错误原因分析
你写的self.course_li = []是给每个实例对象创建了独立的实例属性列表,而非类级别的共享列表。因此:
- 每个实例的
course_li里只有自身一个元素,无法实现所有实例的统一存储 - 类
course本身并没有course_li这个属性,直接通过course.course_li访问自然会报错
构造函数内实现的可行方案
要在__init__里实现类级别的共享列表,只需要在构造函数中先检查类是否存在该共享列表,不存在则初始化,之后将当前实例追加到类属性列表中即可:
class course: def __init__(self, course_name): self.course = course_name # 检查类是否已存在course_li属性,不存在则初始化空列表 if not hasattr(course, 'course_li'): course.course_li = [] # 将当前实例追加到类的共享列表中 course.course_li.append(self) def main(): c1 = course("Math") c2 = course("History") # 现在可以直接通过类访问共享列表 for subject in course.course_li: print(subject.course, end= " ") if __name__ == "__main__": main()
运行这段代码会输出:Math History
补充说明
- 这种方式本质还是在类级别维护共享列表,只是把列表的初始化逻辑放到了
__init__中,第一次创建实例时完成类属性的初始化 - 如果需要清空所有实例的存储,直接执行
course.course_li = []即可,和你之前的类属性写法效果一致 - 也可以用
cls参数结合类方法,但上述写法更直接满足你在构造函数内实现的需求
内容的提问来源于stack exchange,提问作者CJH
相关产品推荐
相关产品推荐

