Tigeroad 发表于 2020-5-28 13:37:04

第46讲描述符课后题T1 无法成功调用__set__()

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

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

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

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

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

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

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

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

class Test:
    x = Record(10, 'x')
    y = Record(8.8, 'y')

test = Test
运行之后IDLE显示如下:
>>> test.x
getting...
10
>>> test.y
getting...
8.8
>>> test.x = 123
>>> test.y = 234
>>> 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


想了一天了还是不知道哪里出了问题,请问大家哪里出了问题呢?非常感谢!

Twilight6 发表于 2020-5-28 13:41:36

test = Test()

加上括号....粗心boy

heidern0612 发表于 2020-5-28 13:58:17

本帖最后由 heidern0612 于 2020-5-28 14:00 编辑

待编辑

Tigeroad 发表于 2020-5-28 13:58:52

Twilight6 发表于 2020-5-28 13:41
加上括号....粗心boy

啊。。。是的。。我咋就没看出来呢{:5_104:}
非常感谢{:10_266:}

Tigeroad 发表于 2020-5-28 14:04:36

heidern0612 发表于 2020-5-28 13:58
你少定义一个self属性,record应该等于其中一个类实参,这样才能直接操作下面文件。

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

楼上说的对,我少了一个括号,加上以后就可以了{:10_250:}你说的“少定义self属性”应该也是这个意思吧
谢谢:)

heidern0612 发表于 2020-5-28 14:08:09

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

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

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

{:10_266:}

Tigeroad 发表于 2020-5-28 15:31:39

heidern0612 发表于 2020-5-28 14:08
嗯,我的原意是你应该在init里面定义个self.file,后来发现不定义也成。

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

哈哈 谢谢啦
页: [1]
查看完整版本: 第46讲描述符课后题T1 无法成功调用__set__()