Нет простого способа сделать то, что вы хотите, из подкласса Wrapper
.Вам нужно либо назвать каждый метод базового класса, который вы хотите обернуть, с помощью декоратора, изменить класс Wrapper
после его создания (возможно, с помощью декоратора класса), либо вам нужно перестроить базовый класс, чтобы помочь вам.
Одним из относительно простых изменений будет то, что методы базового класса будут украшены декоратором, который заставит их всегда вызывать метод «валидатора».В базовом классе валидатор может быть неактивным, но дочерний класс может переопределить его, чтобы сделать все, что вы хотите:
class Base:
def sanity_check(func):
def wrapper(self, *args, **kwargs):
return self.validator(func(self, *args, **kwargs))
return wrapper
def validator(self, results): # this validator accepts everything
return results
@sanity_check
def foo(self):
return "foo"
@sanity_check
def bar(self):
return "bar"
class Derived(Base):
def validator(self, results): # this one doesn't like "bar"
if results == "bar":
raise Exception("I don't like bar")
return results
obj = Derived()
obj.foo() # works
obj.bar() # fails to validate