|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
问题由来是“零基础入门学Python”课程中第46课练习第二题的使用描述符跟踪并保存类属性变动情况:1. 按要求编写描述符 MyDes:记录指定变量的读取和写入操作,并将记录以及触发时间保存到文件:record.txt。我用内嵌函数方式弄妥了,后又想试试装饰器方式,一试之下才发现装饰器的内容竟如此博大精深而自己竟是一窍也没通。。。折腾4、5天了也没搞定。
现在问题是传入被装饰函数进初始化时,发现“func”居然包函了两个位置参数,到“__get__”函数执行完后,直接取"func(r)"发现此时的"func"仅是一个位置参数,不包括被装饰函数的地址了,不能传回调动被装饰函数。__call__函数也不知该在哪写。现将代码附上,恳请各位前辈指教。
- class Record:
- def __init__(self,func,*args):
- self.m = args
- self.value = func
- self.func = func
-
- def __get__(self,instance,owner):
- import time as t
- m = '正在获取变量:%s →'%self.m
- r = t.asctime(t.localtime())+m+str(self.value)
- print(r)
- return r
-
-
- def __set__(self,instance,value):
- import time as t
- m = '正在修改变量:%s →'%self.m
- self.value = value
- print(m,self.value)
- r = t.asctime(t.localtime())+m+str(self.value)
- print(r)
-
- @Record
- def saving(r):
- print('Saving...')
- with open('D:/record.txt','a+') as f:
- f.write(r)
- print('日志已保存!')
-
- class Test:
- x = Record(10,'x')
- y = Record(8.8,'y')
-
- test = Test()
- test.x
- test.x = 13
- test.x
- test.y
- test.y='I love FishC!'
复制代码
|
|