Django: Получите все реализации Абстрактного базового класса

Как насчет чего-либо вовлекающего структуру каталогов в файловую систему. Рекурсивно находя файлы, удаляя файлы, создавая каталоги, и т.д.

Вот реализация 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());
            }
        }       
    }

}
12
задан pisswillis 13 November 2009 в 15:07
поделиться

4 ответа

Взгляните на этот аналогичный вопрос:

Как мне получить доступ к дочерним классам объекта в 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)]

Хотя там также есть ряд других хороших решений. Кажется вероятным, что вам действительно нужны дочерние элементы базового класса, а не только дочерние классы. В противном случае ответы там могут послужить мотиватором для вашего решения.

5
ответ дан 2 December 2019 в 19:31
поделиться

Я не смотрел, что делает 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, он не может найти подклассы. Возможно, немного поигравшись и больше прочитав документ, вы сможете чего-нибудь добиться.

Дайте мне знать, как это работает для вас, так как мне искренне любопытен истинный ответ.

5
ответ дан 2 December 2019 в 19:31
поделиться

Мне удалось использовать метод __ subclass __ () , но не в классе abtract = True . Удаление abstract = True добавит еще одну таблицу в вашу базу данных (и, я полагаю, дополнительные накладные расходы), но тогда вы сможете получить все ее подклассы, как вы описали.

1
ответ дан 2 December 2019 в 19:31
поделиться

Я понимаю, что это некрасивое решение, но я делал это раньше:

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']
1
ответ дан 2 December 2019 в 19:31
поделиться
Другие вопросы по тегам:

Похожие вопросы: