Предпосылка: - У меня есть класс 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 ().Тем не менее, очевидно, есть много проблем с приведенным выше фрагментом:
- Я не совсем уверен, как мне избежать необходимости записывать аргументы для каждого метода, сохраняя при этом все сигнатуры методов (методы в родительском методе).класс может варьироваться по количеству аргументов, некоторые имеют аргументы по умолчанию, которые я хотел бы сохранить без повторного ввода и т. д.)
- Я не уверен, как управлять использованием super () внутри оболочки, так как яу меня нет собственного объекта, я должен проверить, чтобы получить имя каждого метода и т. д.
Любая помощь будет принята с благодарностью!