求助大佬,关于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-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:24 编辑
想想 print()的格式化语法,怎么写来着?——
%号,不就是 占着坑不拉屎 那个家伙吗!
%s,最常见,到处蹲坑占位,以为自己是谁,不就是 “字符串”的马甲么。
%d,%f 两兄弟,比较厚道,喜欢讨论小数点,要还是不要,偶尔才蹲个坑,不跟%s那家伙一般见识!
哦哦,等等,蹲拉完屎坑,后面可要记得 加一个 % 对应上嘛,要擦擦屁屁的嘛~
{:10_297:} 这行代码完全没意义
定义的局部变量filename完全没有使用到 阿奇_o 发表于 2021-4-8 22:21
想想 print()的格式化语法,怎么写来着?——
绝!真的绝! 逃兵 发表于 2021-4-9 08:51
这行代码完全没意义
定义的局部变量filename完全没有使用到
一针见血!一剑封喉!一句点醒梦中人!
页:
[1]