一对一的关系类

时间:2011-01-02 16:22:50

标签: python oop

我希望有一个名为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

还有其他解决方案或此解决方案是否合适?

3 个答案:

答案 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