2011-01-02 2 views
1

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

Есть ли другое решение или это решение хорошее?

+2

мелочью, рассмотреть вопрос об изменении ' "% S/.meta /" % project_directory' в' os.path.join (project_directory, '.meta') ' – SingleNegationElimination

+0

@TokenMacGuy спасибо за советы! :-) –

+0

Похоже, вы дважды храните каждое значение каталога. Почему ProjectDirectory сохраняет значение meta_directory и наоборот? И что вы получаете, делая их уроками вместо простых строк? –

ответ

2

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

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

+2

+1 слияние классов. – SingleNegationElimination

0

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

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 
Смежные вопросы