|
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文件。结果也没有啊)
求解!!!
本帖最后由 阿奇_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)
复制代码
|
最佳答案
查看完整内容
红色那句少了个 self ,应该是 self.filename = ....
我稍微改了下,应该可以了:
……
我错了,2333
|