鱼C论坛

 找回密码
 立即注册
查看: 2214|回复: 9

关于对象的属性调用求助

[复制链接]
发表于 2020-2-23 21:03:39 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
这是一个学生成绩管理系统,新手的第一个小项目,使用openpyxl模块来进行excel的读写操作。这里遇到了一个问题:
我在修改学生对象的成绩属性(一个字典)的时候,出现了一个神奇的BUG,具体如图:

                               
登录/注册后可看大图



                               
登录/注册后可看大图

我使用了两句一模一样的打印学生成绩的语句,而这两句的运行结果截然不同!
前一句打印正常的,每个人的成绩
后一句打印错误的,只有一个人的成绩还重复打印了54遍
各位看217行。。
原代码(未完工的半成品,仅仅能够跑起来的程度,复用性可读性极差,各位轻喷):
  1. import openpyxl as opx  #导入openpyxl
  2. import sys

  3. class_name = ' '
  4. class Classes:        #创建“班级”类
  5.     class_name = ' '  #设置班级名字
  6.     temp = {}         #设置临时存放学生信息的字典
  7.     students_info = {}  #设置存放学生信息的字典
  8.     count_students = 0  #学生计数器
  9.     students_num = [0]  #学生的学号
  10.     exam_name = []      #班级所进行的考试的名称
  11.     def __init__(self): #重写__init__方法
  12.         print("执行初始化程序......")
  13.         self.class_name = input("请设置班级名称:")         #新建班级信息
  14.         print("第一次新建班级,需要导入学生信息!")
  15.         print("需要导入带有任意学生信息的文件(号数+姓名)")
  16.         print("例如,在'半期考.xlsx'中含有学生的号数和姓名,则导入该文件即可")
  17.         print(r"输入格式如下 ---> D:\Users\kitur\Documents\Desktop\高二(1)\第二次月考(2).xlsx")       #导入学生信息
  18.         path = input("请输入文件路径(包含名称):\n")
  19.         wb = opx.load_workbook(path)                        #打开excel工作簿
  20.         for each_sheet in range(len(wb.sheetnames)):
  21.             ws = wb[wb.sheetnames[each_sheet]]                                  #查找学生的号数与其对应的学生名称,并保存在temp中
  22.             for each_row in range(2,10):
  23.                 cells = ws['A' + str(each_row):'Z' + str(each_row)]
  24.                 for each_cell in cells[0]:
  25.                     if each_cell.value == "座号" or each_cell.value == "号数":
  26.                         while each_cell.value != None:
  27.                             num = each_cell.value
  28.                             name = each_cell.offset(0,1).value
  29.                             self.count_students += 1
  30.                             self.temp[num] = name
  31.                             each_cell = each_cell.offset(1)

  32.         if len(self.temp) == 0:
  33.             print("导入的文件中没有学生信息")
  34.         for each_num in range(1,len(self.temp.keys())):                             #由于输入的数据可能不是排序好的,所以在这里排序一下再存放到students_info中
  35.             self.students_info[each_num] = self.temp[each_num]
  36.             self.students_num.append(each_num)
  37.             self.students_num[each_num] = Students(self.students_info[each_num])
  38.         print("学生信息导入成功!")
  39.         print("使用className.import_exam来导入成绩!")
  40.         self.import_exam()                                 

  41.     def import_exam(self):                                  #定义导入成绩的方法
  42.         chinese_score_dict = {"name":"语文"}                #创建一大堆存放学生成绩的字典
  43.         chinese_grade_rank_dict = {"name":"语文段次"}
  44.         math_score_dict = {"name":"数学"}
  45.         math_grade_rank_dict = {"name":"数学段次"}
  46.         english_score_dict = {"name":"英语"}
  47.         english_grade_rank_dict = {"name":"英语段次"}
  48.         physics_score_dict = {"name":"物理"}
  49.         physics_grade_rank_dict = {"name":"物理段次"}
  50.         biology_score_dict = {"name":"生物"}
  51.         biology_grade_rank_dict = {"name":"生物段次"}
  52.         geography_score_dict = {"name":"地理"}
  53.         geography_grade_rank_dict = {"name":"地理段次"}
  54.         history_score_dict = {"name":"历史"}
  55.         history_grade_rank_dict = {"name":"历史段次"}
  56.         politics_score_dict = {"name":"政治"}
  57.         politics_grade_rank_dict = {"name":"政治段次"}
  58.         pe_score_dict = {"name":"体育"}
  59.         pe_grade_rank_dict = {"name":"体育段次"}
  60.         total_score_dict = {"name":"折后总分"}
  61.         grade_rank_dict = {"name":"总分段次"}
  62.         class_rank_dict = {"name":"总分班次"}
  63.         exam_name = input("请输入考试的名字(如:期末考):")
  64.         self.exam_name.append(exam_name)                  #存储考试名称
  65.         print("请输入成绩文件保存的位置")
  66.         print(r"输入格式如下 ---> D:\Users\kitur\Documents\Desktop\高二(1)\第二次月考(2).xlsx")
  67.         path = input()                                    #输入考试信息文件的路径
  68.         wb = opx.load_workbook(path)
  69.         print("有如下sheets,导入哪个?")
  70.         for each_sheet in wb.sheetnames:
  71.             print(each_sheet)
  72.         #import_sheet = input("请输入:")
  73.         import_sheet = 'Sheet1'
  74.         ws = wb[import_sheet]                            #打开考试文件的工作表
  75.         cells = ws['A1':'Z3']
  76.         for each_row in cells:                          #注释实在写不下去了,我真的不知道应该怎么表达我写的这什么**玩意儿
  77.             for each_cell in each_row:
  78.                 if each_cell.value != None:      
  79.                     if type(each_cell.value) == str:
  80.                         if each_cell.value == "座号" or each_cell.value == "号数":
  81.                             num_start = each_cell.offset(1)
  82.                         if "语文" in each_cell.value:
  83.                             if "段" in each_cell.value:
  84.                                 chinese_grade_rank = opx.cell.cell.get_column_letter(each_cell.column)
  85.                             else:
  86.                                 chinese_score_col = opx.cell.cell.get_column_letter(each_cell.column)
  87.                         if "数学" in each_cell.value:
  88.                             if "段" in each_cell.value:
  89.                                 math_grade_rank = opx.cell.cell.get_column_letter(each_cell.column)
  90.                             else:
  91.                                 math_score_col = opx.cell.cell.get_column_letter(each_cell.column)
  92.                         if "英语" in each_cell.value:
  93.                             if "段" in each_cell.value:
  94.                                 english_grade_rank = opx.cell.cell.get_column_letter(each_cell.column)
  95.                             else:
  96.                                 english_score_col = opx.cell.cell.get_column_letter(each_cell.column)
  97.                         if "物理" in each_cell.value:
  98.                             if "段" in each_cell.value:
  99.                                 physics_grade_rank = opx.cell.cell.get_column_letter(each_cell.column)
  100.                             else:
  101.                                 physics_score_col = opx.cell.cell.get_column_letter(each_cell.column)
  102.                         if "生物" in each_cell.value:
  103.                             if "段" in each_cell.value:
  104.                                 biology_grade_rank = opx.cell.cell.get_column_letter(each_cell.column)
  105.                             else:
  106.                                 biology_score_col = opx.cell.cell.get_column_letter(each_cell.column)
  107.                         if "地理" in each_cell.value:
  108.                             if "段" in each_cell.value:
  109.                                 geography_grade_rank = opx.cell.cell.get_column_letter(each_cell.column)
  110.                             else:
  111.                                 geography_score_col = opx.cell.cell.get_column_letter(each_cell.column)
  112.                         if each_cell.coordinate == 'Z3':
  113.                             if geography_score_col == None:
  114.                                 geography_score_col = -1
  115.                             if geography_grade_rank == None:
  116.                                 geography_grade_rank = -1
  117.                         if "历史" in each_cell.value:
  118.                             if "段" in each_cell.value:
  119.                                 history_grade_rank = opx.cell.cell.get_column_letter(each_cell.column)
  120.                             else:
  121.                                 history_score_col = opx.cell.cell.get_column_letter(each_cell.column)
  122.                         if each_cell.coordinate == 'Z3':
  123.                             if history_score_col == None:
  124.                                 history_score_col = -1
  125.                             if history_grade_rank == None:
  126.                                 history_grade_rank = -1
  127.                         if "政治" in each_cell.value:
  128.                             if "段" in each_cell.value:
  129.                                 politics_grade_rank = opx.cell.cell.get_column_letter(each_cell.column)
  130.                             else:
  131.                                 politics_score_col = opx.cell.cell.get_column_letter(each_cell.column)
  132.                         if each_cell.coordinate == 'Z3':
  133.                             if politics_score_col == None:
  134.                                 politics_score_col = -1
  135.                             if politics_grade_rank == None:
  136.                                 politics_grade_rank = -1
  137.                         if "体育" in each_cell.value:
  138.                             if "段" in each_cell.value:
  139.                                 pe_grade_rank = opx.cell.cell.get_column_letter(each_cell.column)
  140.                             else:
  141.                                 pe_score_col = opx.cell.cell.get_column_letter(each_cell.column)
  142.                         if each_cell.coordinate == 'Z3':
  143.                             if pe_score_col == None:
  144.                                 pe_score_col = -1
  145.                             if pe_grade_rank == None:
  146.                                 pe_grade_rank = -1
  147.                         else:
  148.                             pe_grade_rank = -1
  149.                             pe_score_col = -1
  150.                         if each_cell.value == "折后总分":
  151.                             total_score_col = opx.cell.cell.get_column_letter(each_cell.column)
  152.                         if each_cell.value == "段排" or each_cell.value == "段次" or each_cell.value == "年段排名" or each_cell.value == "总分段排" or each_cell.value == "总分段次":
  153.                             grade_rank_col = opx.cell.cell.get_column_letter(each_cell.column)
  154.                         if each_cell.value == "班排" or each_cell.value == "班次" or each_cell.value == "班级排名" or each_cell.value == "总分班排":
  155.                             class_rank_col = opx.cell.cell.get_column_letter(each_cell.column)
  156.                         else:
  157.                             class_rank_col = -1
  158.         while num_start.value != None:      #存储成绩
  159.             i = num_start.value
  160.             chinese_score_dict[i] = ws[str(chinese_score_col) + str(num_start.row)].value
  161.             chinese_grade_rank_dict[i] = ws[str(chinese_grade_rank) + str(num_start.row)].value
  162.             math_score_dict[i] = ws[str(math_score_col) + str(num_start.row)].value
  163.             math_grade_rank_dict[i] = ws[str(math_grade_rank) + str(num_start.row)].value
  164.             english_score_dict[i] = ws[str(english_score_col) + str(num_start.row)].value
  165.             english_grade_rank_dict[i] = ws[str(english_grade_rank) + str(num_start.row)].value
  166.             physics_score_dict[i] = ws[str(physics_score_col) + str(num_start.row)].value
  167.             physics_grade_rank_dict[i] = ws[str(physics_grade_rank) + str(num_start.row)].value
  168.             if biology_score_col != -1:
  169.                 biology_score_dict[i] = ws[str(biology_score_col) + str(num_start.row)].value
  170.             #if biology_grade_rank != -1:
  171.                 #biology_grade_rank_dict[i] = ws[str(biology_grade_rank) + str(num_start.row)].value
  172.             if geography_score_col != -1:
  173.                 geography_score_dict[i] = ws[str(geography_score_col) + str(num_start.row)].value
  174.             #if geography_grade_rank != -1:
  175.                 #geography_grade_rank_dict[i] = ws[str(geography_grade_rank) + str(num_start.row)].value
  176.             if history_score_col != -1:
  177.                 history_score_dict[i] = ws[str(history_score_col) + str(num_start.row)].value
  178.             #if history_grade_rank != -1:
  179.                 #history_grade_rank_dict[i] = ws[str(history_grade_rank) + str(num_start.row)].value
  180.             if politics_score_col != -1:
  181.                 politics_score_dict[i] = ws[str(politics_score_col) + str(num_start.row)].value
  182.             #if politics_grade_rank != -1:
  183.                 #politics_grade_rank_dict[i] = ws[str(politics_grade_rank) + str(num_start.row)].value
  184.             if pe_score_col != -1:
  185.                 pe_score_dict[i] = ws[str(pe_score_col) + str(num_start.row)].value
  186.             #if pe_grade_rank != -1:
  187.                 #pe_grade_rank_dict[i] = ws[str(pe_grade_rank) + str(num_start.row)].value
  188.             if class_rank_col != -1:
  189.                 class_rank_dict[i] = ws[str(class_rank_col) + str(num_start.row)].value
  190.             total_score_dict[i] = ws[str(total_score_col) + str(num_start.row)].value
  191.             grade_rank_dict[i] = ws[str(grade_rank_col) + str(num_start.row)].value
  192.             num_start = num_start.offset(1)
  193.         
  194.         score_save = "exam1"
  195.         if score_save == "exam1":
  196.             for i in range(1,len(self.students_num)):
  197.                 self.students_num[i].exam1["exam_name"] = self.exam_name[-1]
  198.         if score_save == "exam2":
  199.             for i in range(1,len(self.students_num) + 1):
  200.                 self.students_num[i].exam2["exam_name"] = self.exam_name[-1]
  201.         if score_save == "exam3":
  202.             for i in range(1,len(self.students_num) + 1):
  203.                 self.students_num[i].exam3["exam_name"] = self.exam_name[-1]
  204.         if score_save == "exam4":
  205.             for i in range(1,len(self.students_num) + 1):
  206.                 self.students_num[i].exam4["exam_name"] = self.exam_name[-1]
  207.         if score_save == "exam5":
  208.             for i in range(1,len(self.students_num) + 1):
  209.                 self.students_num[i].exam5["exam_name"] = self.exam_name[-1]
  210.         
  211.         for i in range(1,54):                                           #(重点来了,这里报错)将学生的成绩(这里我只导入了语文)导入到学生的成绩表中
  212.             self.students_num[i].exam1["语文"] = chinese_score_dict[i]
  213.             self.students_num[i].exam1["student_num"] = i
  214.             print(self.students_num[i].exam1)                           #打印这个学生的成绩表

  215.         for i in range(1,54):
  216.             print(self.students_num[i].exam1)                           #再次打印,因为发现了这个bug。。



  217. class Students():
  218.     name = "空"
  219.     group = ' '
  220.     exam1 = {}
  221.     exam2 = {}
  222.     exam3 = {}
  223.     exam4 = {}
  224.     exam5 = {}
  225.    
  226.     def __init__(self,name):
  227.         self.name = name
  228.    
  229.                     
  230. C1 = Classes()






复制代码



小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2020-2-23 21:09:24 | 显示全部楼层
我还是比较好奇,需要实现什么功能,
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-2-23 21:16:01 | 显示全部楼层
Stubborn 发表于 2020-2-23 21:09
我还是比较好奇,需要实现什么功能,

存入成绩——>调出成绩
这玩意就是个半成品,先实现一点最基础的简单功能,复杂的以后慢慢加
谁知道会出这种bug。。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-2-23 21:20:56 | 显示全部楼层
Kituro_ 发表于 2020-2-23 21:16
存入成绩——>调出成绩
这玩意就是个半成品,先实现一点最基础的简单功能,复杂的以后慢慢加
谁知道会 ...


虽然我很不想说这代码,发一个表格给我吧,我来看看,存入成绩后,可以调成绩,还包括历史成绩是把?先把表格发给我看下,也可以加我QQ  1263270345
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-2-23 21:23:40 | 显示全部楼层
Stubborn 发表于 2020-2-23 21:20
虽然我很不想说这代码,发一个表格给我吧,我来看看,存入成绩后,可以调成绩,还包括历史成绩是把?先 ...

好的,谢谢,去加QQ了
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-2-23 21:37:51 | 显示全部楼层
Kituro_ 发表于 2020-2-23 21:23
好的,谢谢,去加QQ了

好的
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-2-23 21:40:06 | 显示全部楼层

qq已加,您通过一下
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-2-23 21:41:32 | 显示全部楼层
Kituro_ 发表于 2020-2-23 21:40
qq已加,您通过一下


没收到信息  1263270345  print('')  账号和昵称,或是私信我,我加你也行
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-2-23 21:48:24 | 显示全部楼层
Stubborn 发表于 2020-2-23 21:41
没收到信息  1263270345  print('')  账号和昵称,或是私信我,我加你也行

916292553 qq
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-2-23 21:49:08 | 显示全部楼层
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2026-1-22 20:06

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表