我正在寻求关于优雅设计的建议,用于在Python中表示没有符号链接的文件目录,我可以用“属于”来查询关系(例如,G是/ A /的子目录公元前)。我目前的想法朝这个方向发展:
给定一个根路径我 os.path.walk()它自上而下。两个类代表我感兴趣的节点类型,并跟踪父子关系。
class ADir(object):
def __init_(self, name, parent=None):
self.name = name
self.parent = parent
self.children = []
def add_child(self, id):
self.children.append(id)
class AFile(object):
def __init_(self, name, parent=None):
self.name = name
self.parent = parent
我必须重新实现对现有目录的检查,这些函数给我一个目录/文件的位置等。这一切都开始感觉非常像现有的一般树算法的重新实现。
拖网槽StackExchange,谷歌等产生了各种各样的方法。我发现似乎没有使用给定目录结构的自然边界。
对讨论,博客条目和代码的任何想法和指示都表示赞赏。
答案 0 :(得分:2)
当今语言中树结构的问题在于,很难创建一个适合它们的结构。有许多方法可以构建三个(有或没有父指针,子对象可以是对(二进制或红黑树)或列表(有和没有索引查找键)。
虽然可以为所有这些算法定义遍历算法,但每个算法都需要一个不同的实现。
然后我们有问题在树中查找元素。我们按索引工作(在二叉树中相当无用)?一些标识符?标识符应该具有什么类型?我们如何从这些标识符构建路径?我们如何表示相对路径?
这就是为什么我们有许多现代语言但没有树的地图和列表。据我所知,Scala是为数不多的OO语言之一,它支持通用树类型的概念,但只有二叉树,甚至有些奇怪。
最重要的是,大多数OO语言都不支持从现有类的片段构建类的足够方法。你可以继承(但是你得到了所有东西),多重继承(甚至更多的问题),mix in(多重继承的一些特征没有一些缺点)。但我真的错过了一个功能,其中说明:从x()
类型中获取方法Foo
,从y()
获取方法Bar
以构建Baz
。
如果没有这个,基于OO的树基类需要针对您的特定用例进行大量调整,而直接实现相同的函数则需要相同数量(甚至更少)的代码行。