|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
python 46讲有一道题是创建一个class Mydes
能把对所有的变量的访问/修改/删除记录道record.txt里,我的代码是
- import time
- class Mydes:
- def __init__(self,name='record.txt'):
- self.file = open('/Users/apple/Desktop/python/'+name,'w')
- def record(self,status,name): #记录下来的方法
- time_list = time.gmtime()
- self.file.write('%s变量于UTC%d年%d月%d日%d时%d分%d秒被%s\n'%(name,time_list[0],time_list[1],time_list[2],time_list[3],time_list[4],time_list[5],status))
- self.file.close() #close()保存
- self.file = open('/Users/apple/Desktop/python/'+name,'a')
- def __getattr__(self,name):
- self.record('读取',name)
- return super().__getattr__(name)
- def __setattr__(self,name,value):
- self.record('修改',name)
- super().__setattr__(name,value)
- def __delattr__(self,name):
- self.record('删除',name)
- super().__delattr__(name)
复制代码
但Ta会循环,于是我在前面加了
- import sys
- sys.setrecursionlimit(10)
复制代码
Ta好像在__getattr__和record之间循环了
这是为什么,又该怎么改啊
你造成无限递归的原因是因为你 __init__ 魔法方法初始化 file 参数时候因为是赋值操作,所以会自动调用自身的 __setattr__ 方法
而你 __setattr__ 里面又调用了 record() 函数,又再次 record() 函数里又读取了 self.file 参数 导致触发 __getattr__ 魔法方法
而 __getattr__ 魔法方法里面还调用了 record() 函数,导致无限重复调用自身,而超出递归上限
帮你订正了下错误,顺便改了下代码:
- import time
- class Mydes:
-
- def __init__(self,name='record.txt'):
- self.file = open('/Users/apple/Desktop/python/'+name,'w')
- def record(self,status,name):
- time_list = time.gmtime()
- self.file.write('%s变量于UTC %d 年 %d 月 %d 日 %d 时 %d 分 %d 秒被%s\n'%(name,time_list[0],time_list[1],time_list[2],time_list[3],time_list[4],time_list[5],status)) #close()保存
- def __getattr__(self,name):
- self.record('读取',name)
- def __setattr__(self,name,value):
- if name == 'file':
- super().__setattr__(name,value)
- else:
- self.record('修改',name)
- super().__setattr__(name,value)
- def __delattr__(self,name):
- self.record('删除',name)
- super().__delattr__(name)
复制代码
Ps:建议写描述符的方法,因为这节课主要是练习你写描述符滴
|
|