Индивидуальные классы отношений - PullRequest
1 голос
/ 02 января 2011

Я хочу иметь класс с именем 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 ]

2 голосов
/ 02 января 2011

Это прекрасно, но поскольку теперь между классами есть связь один к одному, вы можете фактически объединить их.Если у вас есть много типов каталогов, кроме ProjectDirectory, вы можете вместо этого наследовать от MetaDirectory.

Но если по какой-то причине вы этого не хотите, приведенный выше дизайн подойдет.В этом нет ничего плохого.

0 голосов
/ 03 января 2011

Если эти каталоги не делают что-то особенное, то есть выполнять дополнительные действия в зависимости от того, находится ли файл в 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
0 голосов
/ 02 января 2011

Я бы создал класс Directory и унаследовал эти классы в вашем примере от этого класса. Если существует больше классов каталогов, то они также наследуются от класса каталогов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...