鱼C论坛

 找回密码
 立即注册
查看: 965|回复: 6

[已解决]第46讲描述符课后题T1 无法成功调用__set__()

[复制链接]
发表于 2020-5-28 13:37:04 | 显示全部楼层 |阅读模式

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

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

x
本帖最后由 Tigeroad 于 2020-5-28 13:37 编辑

题目:1. 按要求编写描述符 :记录指定变量的读取和写入操作,并将记录以及触发时间保存到文件:record.txt。

在看小甲鱼老师的答案之前,我的代码是这么写的:
  1. import time as t
  2. class Record:
  3.     def __init__(self, value, name):
  4.         self.name = name
  5.         self.value = value

  6.     def __get__(self, instance, owner):#__get__可以成功调用
  7.         print('getting...')#测试。__get__可以成功调用
  8.         time = t.localtime()

  9.         #写入文档,用的甲鱼老师课上讲的那个函数,代码有点蠢萌。。
  10.         f = open('record.txt', 'a')
  11.         temp = (self.name + '变量于北京时间 ')
  12.         
  13.         for i in range(6):
  14.             temp += (str(time[i]) + ' ')

  15.         temp += ('被读取, ' + self.name + ' = ' + str(self.value) + ' \n')
  16.         f.writelines(temp)
  17.         f.close()
  18.         
  19.         return self.value

  20.    #以下无法调用,求解
  21.     def __set__(self, instance, value):
  22.         print('setting.....')#测试。__set__无法调用
  23.         time = t.localtime()

  24.         #写入文档,用的甲鱼老师课上讲的那个函数,代码有点蠢萌。。
  25.         f = open('record.txt', 'a')
  26.         temp = (self.name + '变量于北京时间 ')
  27.         for i in range(6):
  28.             temp += (str(time[i]) + ' ')
  29.         temp += ('被修改, ' + self.name + ' = ' + str(self.value) + ' \n')
  30.         f.writelines(temp)
  31.         f.close()
  32.         
  33.         self.value = value

  34. class Test:
  35.     x = Record(10, 'x')
  36.     y = Record(8.8, 'y')

  37. test = Test
复制代码

运行之后IDLE显示如下:
  1. >>> test.x
  2. getting...
  3. 10
  4. >>> test.y
  5. getting...
  6. 8.8
  7. >>> test.x = 123
  8. >>> test.y = 234
  9. >>> test.y = 'i love you!'
复制代码

也就是__get__方法成功调用了, __set__方法没有调用,在record.txt文档中也是同样的结果,只有这两行:
x变量于北京时间 2020 5 28 13 26 59 被读取, x = 10
y变量于北京时间 2020 5 28 13 27 3 被读取, y = 8.8


想了一天了还是不知道哪里出了问题,请问大家哪里出了问题呢?非常感谢!
最佳答案
2020-5-28 13:41:36
  1. test = Test()
复制代码


加上括号....粗心boy
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2020-5-28 13:41:36 | 显示全部楼层    本楼为最佳答案   
  1. test = Test()
复制代码


加上括号....粗心boy
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-5-28 13:58:17 | 显示全部楼层
本帖最后由 heidern0612 于 2020-5-28 14:00 编辑

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

使用道具 举报

 楼主| 发表于 2020-5-28 13:58:52 | 显示全部楼层
Twilight6 发表于 2020-5-28 13:41
加上括号....粗心boy

啊。。。是的。。我咋就没看出来呢
非常感谢  
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-5-28 14:04:36 | 显示全部楼层
heidern0612 发表于 2020-5-28 13:58
你少定义一个self属性,record应该等于其中一个类实参,这样才能直接操作下面文件。

不然都是在类定义阶 ...

楼上说的对,我少了一个括号,加上以后就可以了你说的“少定义self属性”应该也是这个意思吧
谢谢:)
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-5-28 14:08:09 | 显示全部楼层
Tigeroad 发表于 2020-5-28 14:04
楼上说的对,我少了一个括号,加上以后就可以了你说的“少定义self属性”应该也是这个意思吧
...

嗯,我的原意是你应该在init里面定义个self.file,后来发现不定义也成。

ε=(′ο`*)))唉,岁数大了眼花在,字太小看着费劲。

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

使用道具 举报

 楼主| 发表于 2020-5-28 15:31:39 | 显示全部楼层
heidern0612 发表于 2020-5-28 14:08
嗯,我的原意是你应该在init里面定义个self.file,后来发现不定义也成。

ε=(′ο`*)))唉,岁数大了 ...

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

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-6-20 18:01

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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