darchir 发表于 2021-4-8 20:58:39

求助大佬,关于Python课后作业的问题

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文件。结果也没有啊)
求解!!!{:5_94:}

阿奇_o 发表于 2021-4-8 20:58:40

本帖最后由 阿奇_o 于 2021-4-9 01:45 编辑

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

我错了,2333

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

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

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

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

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

    def __set__(self, obj, value):

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

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

class Record:

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

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

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



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

r.val = 200   # 修改(写入数据)
print(r.val)

阿奇_o 发表于 2021-4-8 22:21:46

本帖最后由 阿奇_o 于 2021-4-8 22:24 编辑

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

哦哦,等等,蹲拉完屎坑,后面可要记得 加一个 % 对应上嘛,要擦擦屁屁的嘛~
{:10_297:}

逃兵 发表于 2021-4-9 08:51:46

这行代码完全没意义

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

darchir 发表于 2021-4-9 10:14:14

阿奇_o 发表于 2021-4-8 22:21
想想 print()的格式化语法,怎么写来着?——




绝!真的绝!

darchir 发表于 2021-4-9 10:16:01

逃兵 发表于 2021-4-9 08:51
这行代码完全没意义

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

一针见血!一剑封喉!一句点醒梦中人!
页: [1]
查看完整版本: 求助大佬,关于Python课后作业的问题