python динамически создает класс с внутренним классом

Я использую django-tastypie, и мне нужно создавать такие классы из моих моделей django:

class MyModelResource(ModelResource): class Meta: queryset = MyModel.objects.all() allowed_methods = ['get'] 

Поскольку в моем приложении django у меня много моделей, я не хочу повторять себя и вместо этого использую функцию type () для создания всех классов ресурсов. Проблема в том, что я не знаю, как бороться с этим внутренним классом «Мета».

Можете ли вы дать мне пример того, как динамически создавать класс с внутренним классом с помощью type ()?

One Solution collect form web for “python динамически создает класс с внутренним классом”

 class MyModel(object) : pass modelClass = MyModel() class ModelResource(object): def mymethod(self): print('got here') Meta = type('Meta', (object, ), {'allowed_methods': ['get']}) def add_mymethod(cls): def mymethod(self): super(cls, self).mymethod() cls.mymethod = mymethod return cls name = modelClass.__class__.__name__ + "Resource" MyModelResource = add_mymethod(type(name, (ModelResource, ), {'Meta':Meta, })) print(MyModelResource.Meta) # <class '__main__.Meta'> m = MyModelResource() m.mymethod() # got here 

Внутренний класс, Meta , является еще одним атрибутом в отношении MyModelResource .


Методы также являются просто атрибутами в отношении MyModelResource . Фактически, вы определяете функцию в MyModelResource.__dict__ , а механизм поиска атрибутов Python заставляет inst.mymethod возвращать связанный метод .

Нет проблем со ссылкой на MyModelResource в MyModelResource

 super(MyModelResource, self).mymethod() 

прежде чем MyModelResource определен, потому что поиск имени выполняется во время выполнения, а не в то время, mymethod определяется mymethod .


Вы абсолютно правы, что

 super(self.__class_, self).mymethod() 

неправильно. Это испортит все, что хорошо о super . Если MyModelResource должен быть подклассом, а экземпляр подкласса должен был вызвать mymethod , тогда Python попадает в бесконечный цикл.

 
Interesting Posts for Van-Lav

Вызов подпроцесса без открытия системной консоли

Получить расширение python-markdown для вывода html-тегов с определенным атрибутом класса в Django?

Как переопределить имя столбца в sqlalchemy с использованием рефлексивного и описательного синтаксиса

Как запустить скрипт Tcl в папке на Python?

Python: пытается повысить многоцелевое исключение для нескольких типов ошибок

Python и PYAML – yaml.scanner.ScannerError: значения отображения здесь не допускаются

Python: округление до следующего предопределенного целого в списке

Создание модели Django из существующих баз данных MongoDB

"Pip install –editable ./" vs "python setup.py разработать"

Многоуровневое наследование Python / Mixin

Учение Python с символами новой строки: несогласованная ведущая ошибка пробела

Вращение массива 5D в последних 2 измерениях

Увеличьте размер тепловой карты с помощью морского судна

Python: удалить нечетное число из списка

файл python – setup.py в определенное место

Python - лучший язык программирования в мире.