Украсить метод класса другим методом класса, условно - PullRequest
0 голосов
/ 19 июня 2019

Я думаю, что это расширение к другому вопросу

Фон

Работая с python 2.7, у меня есть класс

class Report(object):
  def translate_report(self, report_entity):
    ... # Process report_entity dictionary and return results

# But there is a legacy report class too
class Legacy_Report(object):
  def translate_report(self, legacy_report_entity):
    ... # Process report_entity dictionary in different way and return results

report_entity - это словарь, выгружаемый в виде строки в текстовом файле. Объекты словаря варьируются в зависимости от Report и Legacy_Report.

Требование

Я воссоздаю экземпляр объекта с помощью этого словаря и вызываю translate_report. Вызывающий метод не зависит от того, является ли объект устаревшей версией или новой.

Мой подход

class Legacy_Report(object):
  @staticmethod
  def _legacy_translation(legacy_report_entry):
    ... # Process
    return legacy_report_entry

  def __call__(self, underlying_function):
    def wrapper_func(self, report_object):
      if 'legacy' in report_object.keys():
        return Decorator._legacy_translation(report_object)
      else:
        return underlying_function(self, report_object)
    return wrapper_func

class Report(object):
  @Legacy_Report()
  def translate_report(self, report_entity):
    ... # Process report_entity 
    return report_entity

Вопрос

Пока это работает, это правильный путь для достижения этого?

Может быть, декоратор на каком-то другом уровне или какой-нибудь лучший питонский способ?

1 Ответ

0 голосов
/ 19 июня 2019

Просто используйте наследование.

class Report(object):
    def translate_report(self, report_entity):
        ... # Process report_entity dictionary and return results


class Legacy_Report(Report):
    def translate_report(self, legacy_report_entity):
        ... # Process the legacy report differently
...