以下类是Anurag生成目录漫游器的动态属性。
import os
class DirLister(object):
def __init__(self, root):
self.root = root
self._list = None
def __getattr__(self, name):
try:
var = super(DirLister).__getattr__(self, name)
return var
except AttributeError:
return DirLister(os.path.join(self.root, name))
def __str__(self):
self._load()
return str(self._list)
def _load(self):
"""
load once when needed
"""
if self._list is not None:
return
self._list = os.listdir(self.root) # list root someway
root = DirLister("/")
print root.etc.apache
有没有办法通过上面的Anurag将其他复杂功能添加到DirLister?所以当它到达一个文件时说testdir / j / p时,会打印出文件p的第一行。
[IN] print testdir.j.p
[OUT] First Line of p
我已经创建了一个用于打印文件第一行的类:
class File:
def __init__(self, path):
"""Read the first line in desired path"""
self.path = path
f = open(path, 'r')
self.first_line = f.readline()
f.close()
def __repr__(self):
"""Display the first line"""
return self.first_line
只需要知道如何将它合并到下面的课程中。谢谢。
答案 0 :(得分:2)
您应该可以通过检查self.root
是_load()
中的文件还是目录来完成此操作。如果它是文件,请读取第一行,如果是目录,则执行os.listdir()
。请尝试以下方法:
import os
class DirLister(object):
def __init__(self, root):
self.root = root
self._data = None
def __getattr__(self, name):
try:
var = super(DirLister).__getattr__(self, name)
return var
except AttributeError:
return DirLister(os.path.join(self.root, name))
def __str__(self):
self._load()
return str(self._data)
def _load(self):
"""
load once when needed
"""
if self._data is not None:
return
if os.path.isfile(self.root):
f = File(self.data)
self._data = f.first_line
else:
self._data = os.listdir(self.root) # list root someway
我使用了您的File
类,但您也可以将代码放在_load()
中获取第一行,而不是使用单独的类来执行此操作。请注意,我还将_list
重命名为_data
,因为它不再总是代表文件列表。