鱼C论坛

 找回密码
 立即注册
查看: 3112|回复: 12

NameError???

[复制链接]
发表于 2016-2-25 13:11:45 | 显示全部楼层 |阅读模式

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

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

x
题目:编写一个描述符,使用文件来存储属性,属性的值会直接存储到pickle的文件中。如果属性被删除了,
文件也会被删除,属性的名字也会被注销


  1. import os
  2. import pickle
  3. class MyDes:
  4.        saved = [ ]
  5.        def __init__(self,name=None):
  6.               self.name = name
  7.               self.filename= self.name+ '.pkl'

  8.        def __get__(self,instace,owner):
  9.               if self.name not in saved:
  10.                      raise AttributeError('%s属性还没有赋值!'%self.name)
  11.               with open(self.filename,'rb') as f:
  12.                      value = pickle.load(f)
  13.               return value

  14.        def __set__(self,instance,value):
  15.               with open(self.filename,'wb') as f:
  16.                      pickle.dump(value,f)
  17.                      MyDes.saved.append(self.name)
  18.        def __delete__(self,instance):
  19.                      os.remove(self.filename)
  20.                      MyDes.saved.remove(self.name)
  21. class C:
  22.        x = MyDes('文件名')
复制代码

  1. >>> c = C()
  2. >>> c.x
  3. Traceback (most recent call last):
  4.   File "<pyshell#4>", line 1, in <module>
  5.     c.x
  6.   File "D:\Python exercise\046魔法方法描述符Property.py", line 162, in __get__
  7.     if self.name not in saved:
  8. NameError: global name 'saved' is not defined
  9. >>> c.x = 'asdffgh'
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2016-2-25 13:12:32 | 显示全部楼层
这是小甲鱼46课的最后一题,请问为什么会有这个错误?
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-2-25 17:59:36 | 显示全部楼层
编译器不是说saved没有被定义吗,小甲鱼老师在全局变量和局部变量的课里面说过这种问题
你的saved实在MyDes里面定义的,而你使用实在又一个函数里面使用的,saved在那里面使用,相当于使用一个新的变量
捕获.PNG

所以把前面改成这样就行了
捕获1.PNG
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-2-25 19:31:03 | 显示全部楼层
shuofxz 发表于 2016-2-25 17:59
编译器不是说saved没有被定义吗,小甲鱼老师在全局变量和局部变量的课里面说过这种问题
你的saved实在MyDe ...

您好,我这个是参照小甲鱼老师打的,但是不能调用__get__()方法。若是按照您的方式,三个方法都不能调用了。不知道是不是我哪里错了
  1. import os
  2. import pickle
  3. class MyDes:

  4.        def __init__(self,name=None):
  5.               self.saved = []
  6.               self.name = name
  7.               self.filename= self.name+ '.pkl'

  8. >>> c = C()
  9. >>> c.x
  10. Traceback (most recent call last):
  11.   File "<pyshell#66>", line 1, in <module>
  12.     c.x
  13.   File "D:\Python exercise\046魔法方法描述符Property.py", line 164, in __get__
  14.     raise AttributeError('%s属性还没有赋值!'%self.name)
  15. AttributeError: 文件名属性还没有赋值!
  16. >>> c. x =123
  17. Traceback (most recent call last):
  18.   File "<pyshell#67>", line 1, in <module>
  19.     c. x =123
  20.   File "D:\Python exercise\046魔法方法描述符Property.py", line 172, in __set__
  21.     MyDes.saved.append(self.name)
  22. AttributeError: type object 'MyDes' has no attribute 'saved'
  23. >>>
复制代码

您好,我是参照小甲鱼的代码打的。只是不能访问__get__()方法

您好,我是参照小甲鱼的代码打的。只是不能访问__get__()方法
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-2-25 20:01:14 | 显示全部楼层
吕浩 发表于 2016-2-25 19:31
您好,我这个是参照小甲鱼老师打的,但是不能调用__get__()方法。若是按照您的方式,三个方法都不能调用 ...

不好意思,没注意后面的代码
那就把这句里面的'saved'    if self.name not in saved:
改成MyDes.saved
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-2-25 20:31:38 | 显示全部楼层
shuofxz 发表于 2016-2-25 20:01
不好意思,没注意后面的代码
那就把这句里面的'saved'    if self.name not in saved:
改成MyDes.saved ...

恩恩,谢谢啦,我的基础太薄弱了,果然零基础,还要继续努力。。。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-2-25 20:32:12 | 显示全部楼层
吕浩 发表于 2016-2-25 20:31
恩恩,谢谢啦,我的基础太薄弱了,果然零基础,还要继续努力。。。

对了,还想问下我这个应该发在技术交流帖子吗?
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-2-25 20:45:53 | 显示全部楼层
吕浩 发表于 2016-2-25 20:32
对了,还想问下我这个应该发在技术交流帖子吗?

提的问题就发在问题求助板块。
技术交流里面是鱼友们发的一些能够实现一些“神奇”功能的代码,或者一些爬虫等,等你把小甲鱼老师的python视频听完爬虫那块,有了一定基础以后,可以去里面看看别人写的比较优秀的代码,学习他们的思路。当然以后你也可以把你实现的一些功能发到那里面去和大家交流
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-2-25 20:51:40 | 显示全部楼层
shuofxz 发表于 2016-2-25 20:45
提的问题就发在问题求助板块。
技术交流里面是鱼友们发的一些能够实现一些“神奇”功能的代码,或者一些 ...

恩恩 好的,我正在努力过程中。版主你学习Python有多久了?
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-2-25 21:00:04 | 显示全部楼层
吕浩 发表于 2016-2-25 20:51
恩恩 好的,我正在努力过程中。版主你学习Python有多久了?

一个月左右吧
不过我之前接触过其他的编程语言,所以学python也相对简单
你要是想快速提高编程能力的话,就把每次的课后作业都好好完成,不明白的发帖子问,平时没事就多上论坛,看看问题交流板块,看有没有自己能解决的。
还有看已经解决的问题,想想你自己的解决思路,再看看别人解决的思路是什么,这样下来你的编程水平也会提高很快的
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-2-25 21:05:17 | 显示全部楼层
shuofxz 发表于 2016-2-25 21:00
一个月左右吧
不过我之前接触过其他的编程语言,所以学python也相对简单
你要是想快速提高编程能力的话 ...

恩恩,好的,学了2个月了,才做到48课,有好几次几乎要一整天才弄明白一道题。。。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-2-25 21:23:08 | 显示全部楼层
吕浩 发表于 2016-2-25 21:05
恩恩,好的,学了2个月了,才做到48课,有好几次几乎要一整天才弄明白一道题。。。

如果是0基础开始学的话,有些问题确实不那么容易想明白
不过你研究透一个问题以后,下次再遇到的时候不就知道怎么解决了吗
编程就是一个多写、多积累的过程等你写够一定的代码量以后,编程能力自然就上去了
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-2-25 21:28:02 | 显示全部楼层
shuofxz 发表于 2016-2-25 21:23
如果是0基础开始学的话,有些问题确实不那么容易想明白
不过你研究透一个问题以后,下次再遇到的时候不 ...

恩恩 ,是的,千里之行-始于足下
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2026-2-19 20:40

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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