@PyCi

Как сделать одну функцию для всех классов?

У меня много классов которые используют одну и туже функцию, но с небольшим отличием. Как мне вывести ее в отдельный класс чтобы не повторяться?

class AttrNameSerializer(serializers.ModelSerializer):

    class Meta:
        model = AttributeName
        fields = '__all__'

    def to_representation(self, instance):
        result = super(AttrNameSerializer, self).to_representation(
            instance)
        return OrderedDict([(key, result[key]) for key in result if
                            result[key] is not None])

class ProductSerializer(serializers.ModelSerializer):
    published_on = serializers.DateTimeField(format='iso-8601')

    class Meta:
        model = Product
        fields = '__all__'

    def to_representation(self, instance):
        result = super(ProductSerializer, self).to_representation(
            instance)
        return OrderedDict([(key, result[key]) for key in result if
                            result[key] is not None])
  • Вопрос задан
  • 68 просмотров
Решения вопроса 1
sergey-gornostaev
@sergey-gornostaev Куратор тега Python
Седой и строгий
Очевидно вынести её в базовый класс или миксин.
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
@rPman
Я не буду сейчас про конкретный пример говорить, и скажу в общем
одну и туже функцию, но с небольшим отличием

универсальное решение - метапрограммирование

Это часто считается говнокодингом, в других языках типа c++ или c# есть препроцессор, простой язык шаблонизатор, игнорирующий частично или полностью синтаксические особенности базового языка

Код функции разбивается на части, подобные в разных экземплярах этих функций, а различия вносятся через параметры функций препроцессора.

В данном случае различия в имени класса, в прокси-вызове super и строки определяющей published_on, соответственно все остальное в функции можно определить в макросе препроцессора и сгенерировать код нужное количество раз, вызвав этот макрос.

Лично я когда мне нужно в метапрограммирование, (использую не смейтесь php) добавив вызов своей утилиты в сборку , но ничто не мешает взять готовое, первый же гуглеж выдает filepp или gpp (сишный синтаксис макросов)

недостатки подхода - исходные файлы до макро могут не поддерживаться IDE и редакторами, сломанный контроль синтаксиса и сложнопонятные сообщения об ошибках могут отпугнуть
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы