2013-10-11 2 views
1

Я нашел код, который намеренно использует __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. Я нахожу, что это основывается на делегировании реализации и предпочитает подклассирование или проверку типов как прямой способ делегирования вызовов соответствующим объектам. Некоторые люди считают, что все в порядке и требуется. Кто-нибудь найдет какие-либо очевидные недостатки в этом или хорошо ли принять эту стратегию для делегирования?

+1

В новых классах классов методы, такие как '__repr__',' __str__' и т. Д., Не могут быть делегированы, так как они выглядят как в классе, так и в виде экземпляра. –

+0

Это применимо только к объектам без состояний? вы воссоздаете 'ClassA()' при каждом вызове 'ClassB .__ getattr__', поэтому не используете состояние' A', а не 'B'. – shx2

ответ

2

Этот тип кода по своей сути является труднопроизносимым и подвержен ошибкам. Бывают ситуации, когда переопределение __getattr__ - это самый простой способ добиться успеха, и в этих ситуациях подойдите к нему. Но всегда предпочитайте подкласс или состав, где это возможно, потому что переопределение __getattr__ может быть болезненным, чтобы получить право.

Смежные вопросы