我希望有一个名为ProjectDirectory
的类和一个名为MetaDirectory
的类。每个项目都有一个MetaDirectory
,其中包含一些元数据。这是写这样的类的好方法:
class ProjectDirectory(object):
def __init__(self, directory=None):
self.directory = directory
self.meta_directory = MetaDirectory(self)
def __repr__(self):
return self.directory
class MetaDirectory(object):
def __init__(self, project_directory=None):
self.project_directory = project_directory
self.directory = "%s/.meta/" % project_directory
ProjectDirectory
引用了MetaDirectory
,而MetaDirectory
引用了ProjectDirectory
。
还有其他解决方案或此解决方案是否合适?
答案 0 :(得分:2)
这很好,但由于类之间现在有一对一的连接,你实际上可以合并它们。如果ProjectDirectory旁边有许多类型的目录,则可以从MetaDirectory继承。
但如果由于某些原因你不想,上面的设计就好了。它本身没有任何问题。
答案 1 :(得分:0)
我将创建Directory类并从该类继承您示例中的那些类。如果有更多的目录类,那么也从Directory类继承。
答案 2 :(得分:0)
除非这些目录做特别的事情,即根据文件是否在ProjectDirectory或MetaDirectory中执行额外的操作,我认为没有理由为它们制作自定义类;我建议
import os
class BadDir(Exception): pass
class Dir(object):
def __init__(self, dirName, test=True):
self.dirName = os.path.abspath(dirName)
self.isTested = test
if test:
self.test()
def test(self):
"Make sure the directory is valid"
d = self.dirName
if not os.path.exists(d):
raise BadDir("The path '{0}' does not exist".format(d))
if not os.path.isdir(d):
raise BadDir("The path '{0}' is not a directory".format(d))
def __add__(self, s):
return Dir(os.path.join(self.dirName, s), self.isTested)
def __str__(self):
return self.dirName
PROJECT = Dir('/Users/Me')
META = PROJECT + 'Desktop'
FILE = META + 'abc.txt'
结果
C:\Users\Me
C:\Users\Me\Desktop
BadDir: The path 'C:\Users\Me\Desktop\abc.txt' is not a directory