如何在python中重写getattr或getattribute,以在其内部调用getattr或getattribute,如惰性递归目录列表中所示
例如,类似这样的事情:如何在python中重写getattr或getattribute,以在其内部调用getattr或getattribute,如惰性递归目录列表中所示,python,setattr,Python,Setattr,例如,类似这样的事情: class DottableLoader(): 定义初始化(self、basedir、loaderfun): self._basedir=pathlib.PosixPath(basedir) self.\u loaderfun=loaderfun self.\u list=list(self.\u basedir.glob('*/')) self.\u name=[x.name.split('=')[1]表示self中的x.\u列表] self.\u names\u di
class DottableLoader():
定义初始化(self、basedir、loaderfun):
self._basedir=pathlib.PosixPath(basedir)
self.\u loaderfun=loaderfun
self.\u list=list(self.\u basedir.glob('*/'))
self.\u name=[x.name.split('=')[1]表示self中的x.\u列表]
self.\u names\u dict=dict(zip(self.\u names,范围(self.\u names)))
定义目录(自我):
返回自己的名字
def uu getattribute_uu(self,name):
#如何在此处访问self.\u列表等?
返回super()。\uuuu getattribute\uuuu(名称)
你可以通过无限递归得到错误
更新:
正确的方法是:
class DottableLoader():
定义初始化(self、basedir、loaderfun):
self._basedir=pathlib.PosixPath(basedir)
self.\u loaderfun=loaderfun
self.\u list=list(self.\u basedir.glob('*/'))
self.\u name=[x.name.split('=')[1]表示self中的x.\u列表]
self.\u names\u dict=dict(zip(self.\u names),范围(len(self.\u names)))
定义目录(自我):
返回self.\u name+super()。\u目录
def _ugetattr _;(self,name):
尝试:
ind=自我。\姓名\口述[姓名]
basedir=self.\u列表[ind]
return dottableLoader(basedir,self.\u loaderfun)
除KeyError外,如e:
返回super()。\uuuu getattribute\uuuu(名称)
最简单的方法是实现\uu getattr\uuu
,只有在正常查找失败时才会调用该方法。这意味着您可以访问\uuu getattr\uuuu
实现中的普通属性,而无需执行任何特殊操作,并且不会递归调用它,因为基类查找成功
def __getattr__(self, name):
return self._list[0] # works fine!
\uuuu getattribute\uuuu
更像是一种特殊情况,因为它是无条件调用的,而不是作为常规查找的回退。根据文件()
如果要访问\uuuuu getattribute\uuuuuuuuuuuuuuuuuuu
中的属性,而不调用自己的重写\uuuuuuuuu getattribute\uuuuuuuuuuuuu
实现,则需要调用对象
实现:
def __getattribute__(self, name):
return object.__getattribute__(self, '_list')[0]
是的,这上面有很多过去的搜索噪音。我以前也做过,但现在找不到。