Расширение нескольких унаследованных методов с контекстом в Python - PullRequest
0 голосов
/ 17 декабря 2018

Предпосылка: - У меня есть класс Parent с> 10 методами и класс Child, который должен реализовать эти 10 методов.- Дочернему классу необходимо добавить квази-контекстное управление ко всем этим методам.Я говорю квазиконтекстное управление, потому что мне не нужен файловый объект для выполнения действий, но мне нужно запустить 2 строки установки / разрыва для каждого метода.- Существуют другие дочерние классы, в которых родительский метод не терпит неудачу, поэтому я не хочу никакого управления контекстом в родительском классе.

Образец кода того, что у меня есть в настоящее время, который, я знаю, можетбыть лучше:

class Parent(object):
    def foo(self, arg1='default', argn):
       print("Action that might fail: {} {}".format(arg1, argn))

class Child(Parent):
    def bar(self, arg1, argn):
       setup_method()
       super(Child, self).bar(arg1, argn)
       teardown_method()

    def teardown_method()
       print("This is just a new method in the Child class")
       print("These two lines prevent real-world issues")

Псевдокод того, что я хочу (или что-то вроде этого):

import wrapt, inspect


@wrapt.decorator
def wrapper(wrapped, instance, args, kwargs):
    def add_context(*args, **kwargs):
        with context_man:
            parent_method_of_same_name = get_parent_method(instance)     # use inspect module?
            calling_class = inspect.getmro(wrapped) # use inspect module?
            super(calling_class, self).parent_method_of_same_name(*args, **kwargs)  # use of self here?

    class context_man(object):
        def __enter__(self):
            print("These two lines prevent real-world issues")

        def __exit__(self):
            print("These two lines prevent real-world issues")

    return add_context(*args, **kwargs)

class Parent(object):
    def foo(self, arg1='default', argn):
       print("Action that might fail: {} {}".format(arg1, argn))

class Child(Parent):
    @wrapper
    def bar(self, args, kwargs):
        pass

Это было бы очень выгодно при работе со всеми>10 методов, так как мне не нужно повторять операторы try-catch и не нужно повторять вызовы super ().Тем не менее, очевидно, есть много проблем с приведенным выше фрагментом:

  1. Я не совсем уверен, как мне избежать необходимости записывать аргументы для каждого метода, сохраняя при этом все сигнатуры методов (методы в родительском методе).класс может варьироваться по количеству аргументов, некоторые имеют аргументы по умолчанию, которые я хотел бы сохранить без повторного ввода и т. д.)
  2. Я не уверен, как управлять использованием super () внутри оболочки, так как яу меня нет собственного объекта, я должен проверить, чтобы получить имя каждого метода и т. д.

Любая помощь будет принята с благодарностью!

...