Я пишу класс, который оборачивается вокруг объекта другого класса. Намерение состоит в том, чтобы изменить некоторые из его методов поведения, в то же время способный расширить все другие его интерфейсы. Я не использую наследование, потому что внутренний объект класса может умереть, а внешний класс должен иметь возможность заменить его живым без разрушения самого себя.
так у меня есть:
class Inner():
def foo(): pass
def goo(): pass
class Outer():
self.inner = InnerFactory(innerType)
def foo():
try:
self.inner.foo()
except:
del self.inner
self.inner = InnerFactory(innerType)
self.inner.foo()
Вопрос в том, как расширить goo без явной перезаписи, поскольку у меня может быть множество других подобных методов, о которых я не знаю.
На самом деле, прочитав некоторые отзывы ниже, я понял, что не использую отличную функцию getattr . Однако я не совсем понимаю, почему приведенные ниже предложения, похоже, используют такую сложную версию. Почему это не может быть так просто, как:
def __getattr__( self, name ):
if self.inner:
return getattr( self.inner, name )
else:
raise Exception( 'attribute %s not found' % name )