Я нашел код, который намеренно использует __getattr__
для делегирования.Использование __getattr__ для делегирования
class ClassA(object):
def __init__(self):
self.a = 10
self.b = 20
def methodA(self):
return "method A"
class ClassB(object):
def __init__(self):
self.a = 30
self.b = 40
def methodB(self):
return "method B"
def __getattr__(self, arg):
return getattr(ClassA(), arg)
obj = ClassB()
obj.methodB()
obj.methodA()
try:
obj.something
except AttributeError:
print("Attribute not found.")
Это работает, потому что __getattr__
ищется последний и, когда она не находится в ClassA, это делегированы к ClassB. Я нахожу, что это основывается на делегировании реализации и предпочитает подклассирование или проверку типов как прямой способ делегирования вызовов соответствующим объектам. Некоторые люди считают, что все в порядке и требуется. Кто-нибудь найдет какие-либо очевидные недостатки в этом или хорошо ли принять эту стратегию для делегирования?
В новых классах классов методы, такие как '__repr__',' __str__' и т. Д., Не могут быть делегированы, так как они выглядят как в классе, так и в виде экземпляра. –
Это применимо только к объектам без состояний? вы воссоздаете 'ClassA()' при каждом вызове 'ClassB .__ getattr__', поэтому не используете состояние' A', а не 'B'. – shx2