Как насчет чего-либо вовлекающего структуру каталогов в файловую систему. Рекурсивно находя файлы, удаляя файлы, создавая каталоги, и т.д.
Вот реализация Java, которая рекурсивно распечатывает содержание каталога и его подкаталогов.
import java.io.File;
public class DirectoryContentAnalyserOne implements DirectoryContentAnalyser {
private static StringBuilder indentation = new StringBuilder();
public static void main (String args [] ){
// Here you pass the path to the directory to be scanned
getDirectoryContent("C:\\DirOne\\DirTwo\\AndSoOn");
}
private static void getDirectoryContent(String filePath) {
File currentDirOrFile = new File(filePath);
if ( !currentDirOrFile.exists() ){
return;
}
else if ( currentDirOrFile.isFile() ){
System.out.println(indentation + currentDirOrFile.getName());
return;
}
else{
System.out.println("\n" + indentation + "|_" +currentDirOrFile.getName());
indentation.append(" ");
for ( String currentFileOrDirName : currentDirOrFile.list()){
getPrivateDirectoryContent(currentDirOrFile + "\\" + currentFileOrDirName);
}
if (indentation.length() - 3 > 3 ){
indentation.delete(indentation.length() - 3, indentation.length());
}
}
}
}
Взгляните на этот аналогичный вопрос:
Как мне получить доступ к дочерним классам объекта в django, не зная имени дочернего класса?
Мое решение было по существу следующим:
def get_children(self):
rel_objs = self._meta.get_all_related_objects()
return [getattr(self, x.get_accessor_name()) for x in rel_objs if x.model != type(self)]
Хотя там также есть ряд других хороших решений. Кажется вероятным, что вам действительно нужны дочерние элементы базового класса, а не только дочерние классы. В противном случае ответы там могут послужить мотиватором для вашего решения.
Я не смотрел, что делает Django, когда вы устанавливаете абстрактное значение True в бэкэнде, но я поигрался с этим и обнаружил, что это работает. Обратите внимание, это работает только в Python 2.6
from abc import ABCMeta
class ABClass():
__metaclass__ = ABCMeta
class ConcreteClass1(ABClass):
pass
class ConcreteClass2(ABClass):
pass
print ABClass.__subclasses__()
Результаты в
[<class '__main__.ConcreteClass1'>, <class '__main__.ConcreteClass2'>]
Без использования ABCMeta и __ метакласса __
вы получите пустой список.
Вы можете прочитать хорошее описание того, что происходит здесь . Единственная проблема с этим, и я не уверен, повлияет ли это на вас, заключается в том, что я не могу понять, почему, когда я создаю экземпляр ABClass, он не может найти подклассы. Возможно, немного поигравшись и больше прочитав документ, вы сможете чего-нибудь добиться.
Дайте мне знать, как это работает для вас, так как мне искренне любопытен истинный ответ.
Мне удалось использовать метод __ subclass __ ()
, но не в классе abtract = True
. Удаление abstract = True
добавит еще одну таблицу в вашу базу данных (и, я полагаю, дополнительные накладные расходы), но тогда вы сможете получить все ее подклассы, как вы описали.
Я понимаю, что это некрасивое решение, но я делал это раньше:
class ABClass(models.Model):
#common attributes
is_ABClass = True
class Meta:
abstract = True
class ConcreteClass1(ABClass):
#implementation specific attributes
class ConcreteClass2(ABClass):
#implementation specific attributes
class ModifiedConcreteClass1(ConcreteClass1):
#implementation specific attributes
def get_ABClasses():
this = modules[__name__]
return [getattr(this, attr) for attr in dir(this)
if hasattr(getattr(this, attr), 'is_ABClass') and attr != 'ABClass']