Если я вас правильно понимаю, вы ищете простой способ делегировать метод объекта свойству этого объекта?
Вы можете избежать некоторых повторений, определив декоратор:
def delegate(method, prop):
def decorate(cls):
setattr(cls, method,
lambda self, *args, **kwargs:
getattr(getattr(self, prop), method)(*args, **kwargs))
return cls
return decorate
Затем вы можете применить декоратор для каждого метода, который вы хотите делегировать:
@delegate('__len__', '_content')
@delegate('__getitem__', '_content')
class MyList(object):
def __init__(self, content):
self._content = content
spam = MyList([1,2,3,4,5])
len(spam) # prints "5"
spam[0] # prints "1"
Возможно, вы могли бы еще больше упростить его, изменив декоратор так, чтобы в качестве аргумента принимались несколько имен методов.
Если вы хотите, чтобы ваш класс действовал как полная обертка, вы, возможно, могли бы переопределить метод __getattr__
класса, чтобы проверить завернутый объект перед сбоем. Это подражало бы поведению подклассов без фактического наследования.