鱼C论坛

 找回密码
 立即注册
查看: 1966|回复: 5

[已解决]求助大佬,关于Python课后作业的问题

[复制链接]
发表于 2021-4-8 20:58:39 | 显示全部楼层 |阅读模式
5鱼币
46讲描述符课后作业动动手1: 按要求编写描述符 MyDes:记录指定变量的读取和写入操作,并将记录以及触发时间保存到文件(record.txt)

小甲鱼的答案是:
import time

class Record:
    def __init__(self, initval=None, name=None):
        self.val = initval
        self.name = name
        self.filename = "record.txt"

    def __get__(self, instance, owner):
        with open(self.filename, 'a', encoding='utf-8') as f:
            f.write("%s 变量于北京时间 %s 被读取,%s = %s\n" % \
                    (self.name, time.ctime(), self.name, str(self.val)))
        return self.val

    def __set__(self, instance, value):
       filename = "%s_record.txt" % self.name
        with open(self.filename, 'a', encoding='utf-8') as f:
            f.write("%s 变量于北京时间 %s 被修改, %s = %s\n" % \
                    (self.name, time.ctime(), self.name, str(value)))
        self.val = value

其中红色部分是啥作用?看不懂。
有这行没这行输出结果没什么区别(我以为会创建一个x_record.txt 或者 y_record.txt文件。结果也没有啊)
求解!!!
最佳答案
2021-4-8 20:58:40
本帖最后由 阿奇_o 于 2021-4-9 01:45 编辑

红色那句少了个 self ,应该是 self.filename = ....
我稍微改了下,应该可以了:
……

我错了,2333

  1. # 仔细查了文档,才知道原来是 叫 描述器 的用法。
  2. # 描述器 Descriptor 常用在 动态监测某些类变量(或根据这些变量进行特殊的计算),
  3. # 如 动态监测一个文件夹(类对象),该文件夹内有多少个文件(变量)。这是官方给出的例子。

  4. # 看看这道题,怎么做。动态监测 一个变量的读写情况……

  5. class Opt:  #创建一个“读写”操作的类
  6.     def __get__(self, obj, objtype=None): # 描述器 (读操作,并记录)

  7.         value = obj._val    #读取数据(这里必须 以私有属性来引用 该记录类对象的属性值,故用了 _ 单下划线)
  8.                             #若写 obj.val,会导致循环引用,死循环。 为什么必须这样呢?有的难理解……

  9.         with open('xxx_record.txt', 'a', encoding='utf-8-sig') as f:
  10.             f.write("r: 读取数据。  操作时间:{}\n".format(time.ctime()))
  11.         return value

  12.     def __set__(self, obj, value):

  13.         obj._val = value    #写入数据(注意是给 记录类对象的属性 进行赋值)

  14.         with open('xxx_record.txt', 'a', encoding='utf-8-sig') as f:
  15.             f.write('w: 修改数据。  操作时间:{}\n'.format(time.ctime()))
  16.             print("-----数据修改成功------")

  17. class Record:

  18.     val = Opt() # 创建描述器实例(从而当引用该val时,即可触发 描述器的__get__,和 __set__)

  19.     def __init__(self, init_val):
  20.         with open('xxx_record.txt', 'w', encoding='utf-8-sig') as f:
  21.             pass #以写模式,创建文件,不做任何操作,以 清空文件内容

  22.         self.val = init_val  # 初始化时,就赋予传入实参 (写操作,随之触发)



  23. r = Record(init_val=100)    #注:初始化时,就会有一次 写入操作。
  24. print(r.val)    # 记得,在类里定义了 val = Opt() 而 Opt类里有 __get__() 描述器
  25. print(r.val)

  26. r.val = 200   # 修改(写入数据)
  27. print(r.val)
复制代码

最佳答案

查看完整内容

红色那句少了个 self ,应该是 self.filename = .... 我稍微改了下,应该可以了: …… 我错了,2333
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2021-4-8 20:58:40 | 显示全部楼层    本楼为最佳答案   
本帖最后由 阿奇_o 于 2021-4-9 01:45 编辑

红色那句少了个 self ,应该是 self.filename = ....
我稍微改了下,应该可以了:
……

我错了,2333

  1. # 仔细查了文档,才知道原来是 叫 描述器 的用法。
  2. # 描述器 Descriptor 常用在 动态监测某些类变量(或根据这些变量进行特殊的计算),
  3. # 如 动态监测一个文件夹(类对象),该文件夹内有多少个文件(变量)。这是官方给出的例子。

  4. # 看看这道题,怎么做。动态监测 一个变量的读写情况……

  5. class Opt:  #创建一个“读写”操作的类
  6.     def __get__(self, obj, objtype=None): # 描述器 (读操作,并记录)

  7.         value = obj._val    #读取数据(这里必须 以私有属性来引用 该记录类对象的属性值,故用了 _ 单下划线)
  8.                             #若写 obj.val,会导致循环引用,死循环。 为什么必须这样呢?有的难理解……

  9.         with open('xxx_record.txt', 'a', encoding='utf-8-sig') as f:
  10.             f.write("r: 读取数据。  操作时间:{}\n".format(time.ctime()))
  11.         return value

  12.     def __set__(self, obj, value):

  13.         obj._val = value    #写入数据(注意是给 记录类对象的属性 进行赋值)

  14.         with open('xxx_record.txt', 'a', encoding='utf-8-sig') as f:
  15.             f.write('w: 修改数据。  操作时间:{}\n'.format(time.ctime()))
  16.             print("-----数据修改成功------")

  17. class Record:

  18.     val = Opt() # 创建描述器实例(从而当引用该val时,即可触发 描述器的__get__,和 __set__)

  19.     def __init__(self, init_val):
  20.         with open('xxx_record.txt', 'w', encoding='utf-8-sig') as f:
  21.             pass #以写模式,创建文件,不做任何操作,以 清空文件内容

  22.         self.val = init_val  # 初始化时,就赋予传入实参 (写操作,随之触发)



  23. r = Record(init_val=100)    #注:初始化时,就会有一次 写入操作。
  24. print(r.val)    # 记得,在类里定义了 val = Opt() 而 Opt类里有 __get__() 描述器
  25. print(r.val)

  26. r.val = 200   # 修改(写入数据)
  27. print(r.val)
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2021-4-8 22:21:46 | 显示全部楼层
本帖最后由 阿奇_o 于 2021-4-8 22:24 编辑

想想 print()的格式化语法,怎么写来着?——
%号,不就是 占着坑不拉屎 那个家伙吗!
%s,最常见,到处蹲坑占位,以为自己是谁,不就是 “字符串”的马甲么。
%d,%f 两兄弟,比较厚道,喜欢讨论小数点,要还是不要,偶尔才蹲个坑,不跟%s那家伙一般见识!


哦哦,等等,蹲拉完屎坑,后面可要记得 加一个 % 对应上嘛,要擦擦屁屁的嘛~
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2021-4-9 08:51:46 | 显示全部楼层
这行代码完全没意义

定义的局部变量filename完全没有使用到
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2021-4-9 10:14:14 | 显示全部楼层
阿奇_o 发表于 2021-4-8 22:21
想想 print()的格式化语法,怎么写来着?——

绝!真的绝!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2021-4-9 10:16:01 | 显示全部楼层
逃兵 发表于 2021-4-9 08:51
这行代码完全没意义

定义的局部变量filename完全没有使用到

一针见血!一剑封喉!一句点醒梦中人!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-5-26 02:34

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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