鱼C论坛

 找回密码
 立即注册
查看: 1768|回复: 11

[已解决]改写一段代码(首次尝试对代码进行类的封装),还望各位高手给些建议

[复制链接]
发表于 2020-2-7 19:42:32 | 显示全部楼层 |阅读模式

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

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

x
本帖最后由 wp231957 于 2020-2-8 09:03 编辑

代码copy过去是可以直接运行的


修正了等号前后空格问题, 同时也修正了一些小的bug,感谢dlnb526同学,zltzlt同学


  1. import requests,json

  2. class Exam(object):
  3.     def __init__(self,urla,urlb):
  4.         self.urla = urla
  5.         self.urlb = urlb
  6.         self.headers = {'user-agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.108 Safari/537.36'}
  7.         self.test_word  =  []
  8.         self.words_know  =  []
  9.         self.not_know  =  []
  10.         self.n = 0
  11.         self.right = 0
  12.         self.wrong  =  []
  13.         self.choice = 1
  14.         self.choicestr = '''请输入你选择的词库编号,按Enter确认
  15.                           1,GMAT  2,考研  3,高考  4,四级  5,六级  6,英专  7,托福  8,GRE  9,雅思  10,任意'''
  16.         self.startstr = '''
  17.                         5分钟,评估你的单词量
  18.                         评估过程包括三步:
  19.                         1. 选择适合你的出题范围
  20.                         2. 通过50个单词得到你的大致词汇量范围
  21.                         3. 检验你是否真的掌握你在第二步中选择的单词'''
  22.     def getwords(self):
  23.         return requests.get(self.urla,headers = self.headers).json()
  24.    
  25.     def gettest(self,choice):
  26.         return requests.get(self.urlb+choice,headers = self.headers).json()
  27.         
  28.     #选择自己想测试的词库   
  29.     def setchoice(self):
  30.         words = self.getwords()
  31.         lst  =  []
  32.         types  =  words['data']
  33.         for type in types:
  34.            lst.append(type[0])
  35.         print(self.choicestr)   
  36.         choice  =  int(input('>'))
  37.         self.choice  =  lst[choice-1]
  38.         print(self.choice)
  39.     # A 阶段测试         
  40.     def testa(self):
  41.         self.setchoice()
  42.         test_json  = self.gettest(self.choice)
  43.         for i in test_json['data']:
  44.             danci  =  i['content']
  45.             self.n  =  self.n + 1
  46.             print(f'\n第{self.n}个单词{danci}是否认识,如果认识请按y,如果不认识请按n,输入Esc结束此阶段')
  47.             answer  =  input('>')
  48.             if answer  ==  'y':
  49.                 self.test_word.append(danci)
  50.                 self.words_know.append(i)
  51.             elif answer  ==  'n':
  52.                 self.not_know.append(i)
  53.             elif answer.lower()  ==  'esc':
  54.                 break
  55.             else:
  56.                 print('\n输入错误,请按提示输入。')
  57.     # B 阶段测试     
  58.     def testb(self):
  59.         for i in self.words_know:
  60.             print(i['content'])
  61.             print('--------------------------------')
  62.             print('A.'+ i['definition_choices'][0]['definition'])
  63.             print('B.'+ i['definition_choices'][1]['definition'])
  64.             print('C.'+ i['definition_choices'][2]['definition'])
  65.             print('D.'+ i['definition_choices'][3]['definition'])
  66.             xuan  =  input('请输入你的选择:')
  67.             print('--------------------------------\n')
  68.             dic  =  {'A':i['definition_choices'][0]['pk'],'B':i['definition_choices'][1]['pk'],
  69.                    'C':i['definition_choices'][2]['pk'],'D':i['definition_choices'][3]['pk']}
  70.             if dic[xuan.upper()]  ==  i['pk']:
  71.                 self.right  =  self.right + 1
  72.             else:
  73.                 self.wrong.append(i['content'])
  74.     #最后评分阶段           
  75.     def pingfen(self):
  76.         print('本次测试小结:')
  77.         print(f'50个单词里面,有{len(self.test_word)}单词你是认识,有'+
  78.               str(50-int(len(self.test_word)))+
  79.               f'单词你是不认识的,在认识的单词里面,你做对了{self.right}个,做错了'+
  80.               str(int(len(self.test_word))-self.right)+'个,请继续努力')   
  81.          
  82. def main():        
  83.     urla  =  'https://www.shanbay.com/api/v1/vocabtest/category/?_ = 1580454535232'
  84.     urlb = 'https://www.shanbay.com/api/v1/vocabtest/vocabularies/?category = '
  85.     exam = Exam(urla,urlb)  
  86.     print(exam.startstr)
  87.     exam.testa()
  88.     print("进行下一阶段的测试")
  89.     exam.testb()
  90.     print("下面进行评分")
  91.     exam.pingfen()
  92.    
  93. if __name__ == "__main__":
  94.     main()   

复制代码


还可以这样玩,把类代码藏起来

  1. import requests,json
  2. from exama import Exam

  3. def main():        
  4.     urla  =  'https://www.shanbay.com/api/v1/vocabtest/category/?_ = 1580454535232'
  5.     urlb = 'https://www.shanbay.com/api/v1/vocabtest/vocabularies/?category = '
  6.     exam = Exam(urla,urlb)  
  7.     print(exam.startstr)
  8.     exam.testa()
  9.     print("进行下一阶段的测试")
  10.     exam.testb()
  11.     print("下面进行评分")
  12.     exam.pingfen()
  13.    
  14. if __name__ == "__main__":
  15.     main()   
复制代码
最佳答案
2020-2-7 21:45:38
本帖最后由 dlnb526 于 2020-2-7 21:46 编辑


改成这样应该就可以了
  1. def testb(self):
  2.         for i in self.words_know:
  3.             print(i['content'])
  4.             print('--------------------------------')
  5.             print('A.'+ i['definition_choices'][0]['definition'])
  6.             print('B.'+ i['definition_choices'][1]['definition'])
  7.             print('C.'+ i['definition_choices'][2]['definition'])
  8.             print('D.'+ i['definition_choices'][3]['definition'])
  9.             xuan = input('请输入你的选择:')
  10.             print('--------------------------------\n')
  11.             dic = {'A':i['definition_choices'][0]['pk'],'B5':i['definition_choices'][1]['pk'],
  12.                    'C':i['definition_choices'][2]['pk'],'D':i['definition_choices'][3]['pk']}
  13.             if dic[xuan.upper()] == i['pk']:
  14.                 self.right = self.right + 1
  15.             else:
  16.                 self.wrong.append(i['content'])
复制代码



我加了print(i['content'])
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2020-2-7 20:16:28 | 显示全部楼层
本帖最后由 dlnb526 于 2020-2-7 21:41 编辑


学习了!

  1. # B 阶段测试     
  2.     def testb(self):
  3.         for i in self.words_know:
  4.             print('--------------------------------')
  5.             print('A.'+ i['definition_choices'][0]['definition'])
  6.             print('B.'+ i['definition_choices'][1]['definition'])
  7.             print('C.'+ i['definition_choices'][2]['definition'])
  8.             print('D.'+ i['definition_choices'][3]['definition'])
  9.             xuan = input('请输入你的选择:')
  10.             print('--------------------------------\n')
  11.             dic = {'A':i['definition_choices'][0]['pk'],'B':i['definition_choices'][1]['pk'],
  12.                    'C':i['definition_choices'][2]['pk'],'D':i['definition_choices'][3]['pk']}
  13.             if dic[xuan.upper()] == i['pk']:
  14.                 self.right = self.right + 1
  15.             else:
  16.                 self.wrong.append(i['content'])
复制代码


这一部分是不是少了初始单词的爬取~

  1. >Esc
  2. 进行下一阶段的测试
  3. --------------------------------
  4. A. vt.想; 思索; 以为; 看待
  5. B. n. 产品, 农作物
  6. C. n. 队,组
  7. D. n. 搬运, 射程, 投射, 联运

  8. 请输入你的选择:
复制代码


这个样子没办法选择呀~~
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-2-7 21:36:14 | 显示全部楼层
代码不够美观
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-2-7 21:39:15 From FishC Mobile | 显示全部楼层
zltzlt 发表于 2020-2-7 21:36
代码不够美观

哪方面的??不美观
我主要想看一下,我这里是否提现了类的思想
因为我就是从函数硬套过来的
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-2-7 21:39:58 | 显示全部楼层
wp231957 发表于 2020-2-7 21:39
哪方面的??不美观
我主要想看一下,我这里是否提现了类的思想
因为我就是从函数硬套过来的

= 号之间一个空格
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-2-7 21:44:23 From FishC Mobile | 显示全部楼层
zltzlt 发表于 2020-2-7 21:39
= 号之间一个空格

嗯,我还真不注重这东西
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-2-7 21:45:38 | 显示全部楼层    本楼为最佳答案   
本帖最后由 dlnb526 于 2020-2-7 21:46 编辑


改成这样应该就可以了
  1. def testb(self):
  2.         for i in self.words_know:
  3.             print(i['content'])
  4.             print('--------------------------------')
  5.             print('A.'+ i['definition_choices'][0]['definition'])
  6.             print('B.'+ i['definition_choices'][1]['definition'])
  7.             print('C.'+ i['definition_choices'][2]['definition'])
  8.             print('D.'+ i['definition_choices'][3]['definition'])
  9.             xuan = input('请输入你的选择:')
  10.             print('--------------------------------\n')
  11.             dic = {'A':i['definition_choices'][0]['pk'],'B5':i['definition_choices'][1]['pk'],
  12.                    'C':i['definition_choices'][2]['pk'],'D':i['definition_choices'][3]['pk']}
  13.             if dic[xuan.upper()] == i['pk']:
  14.                 self.right = self.right + 1
  15.             else:
  16.                 self.wrong.append(i['content'])
复制代码



我加了print(i['content'])
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-2-7 21:48:43 From FishC Mobile | 显示全部楼层
dlnb526 发表于 2020-2-7 21:45
改成这样应该就可以了



还没看,这部分是上面选择y的部分
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-2-7 21:51:04 From FishC Mobile | 显示全部楼层
dlnb526 发表于 2020-2-7 20:16
学习了!



谢谢,这算程序的一个bug
我主要关注的是这个类写的是不是  不伦不类
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-2-7 21:57:55 | 显示全部楼层
wp231957 发表于 2020-2-7 21:51
谢谢,这算程序的一个bug
我主要关注的是这个类写的是不是  不伦不类

我觉得大佬的类写的很好呀。我理解中类就是反映显示事物的。
相当于现实中的考试类,有考什么这种属性,也有答对答错这种行为什么的,这就是一个很好的类了吧。

在大佬面前献丑了~
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-2-8 08:53:31 | 显示全部楼层

代码已修正,请指示
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-2-8 08:55:13 | 显示全部楼层
dlnb526 发表于 2020-2-7 21:57
我觉得大佬的类写的很好呀。我理解中类就是反映显示事物的。
相当于现实中的考试类,有考什么这种属性, ...

我可不是什么大佬,充其量小学生吧
那天在网上看到适合中级python练习的题目,13道题目  我顶多能做出来一个半个的   惭愧呢
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-12-6 02:34

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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