本帖最后由 阿奇_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)
|