Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/xslt/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在python中重写getattr或getattribute,以在其内部调用getattr或getattribute,如惰性递归目录列表中所示_Python_Setattr - Fatal编程技术网

如何在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]

是的,这上面有很多过去的搜索噪音。我以前也做过,但现在找不到。