Параметризировать Python класс - PullRequest
1 голос
/ 29 февраля 2020

Есть ли способ параметризации класса в Python? Параметризованный класс может выглядеть примерно так:

class FIELDSerializer:
    FIELD = serializers.CharField(source='get_FIELD_display', required=False)

    class Meta:
        model = None
        fields = {FIELD}

Для чего потребуется создать следующие три класса:

class NameSerializer:
    name = serializers.CharField(source='get_name_display', required=False)

    class Meta:
        model = None
        fields = {'name'}

class CategorySerializer:
    category = serializers.CharField(source='get_category_display', required=False)

    class Meta:
        model = None
        fields = {'category'}

class StateSerializer:
    state = serializers.CharField(source='get_state_display', required=False)

    class Meta:
        model = None
        fields = {'state'}

Возможно ли это или нет?

1 Ответ

3 голосов
/ 29 февраля 2020

Вы можете делать то, что хотите, с помощью заводской функции, хотя не так просто получить внутренние переменные (атрибуты) так, как вы хотите:

def factory(FIELDname):

    class FIELDSerializer:

        class Meta:
            model = None
            fields = {FIELDname}

     settatr(FIELDSerializer, FIELDname, serializers.CharField(source=f'get_{FIELDname}_display', required=False))

     return FIELDSerializer

CategorySerializer = factory('category')
StateSerializer = factory('state')
NameSerializer = factory('name')

setattr позволяет нам установить имя атрибута в строку FIELDname. (Спасибо @ Code-Apprentice и @juanpa.arrivillaga за эту идею.)

Я не знаю, есть ли какой-нибудь простой способ избежать повторения имя поля и имя нужного класса, когда вы вызываете фабрику, не используя что-то вроде exec (что совершенно законно, но обычно оставляет программистов с неприятным вкусом во рту).

...