Когда attr == '__str__'
, функция должна возвращать вызываемый объект, потому что __str__
, как ожидается, будет методом. Простое возвращение строки даст вам сообщение о том, что объекты 'str' не подлежат вызову.
Однако *args
не требуется, так как __str__
никогда не вызывается никакими аргументами. Этого достаточно:
return lambda: '[Getattr str]'
Обратите внимание, что если вы используете python2 и наследовать от object
, как рекомендуется, пример не работает. И если вы используете python3, это тоже не сработает. Это выход в тех случаях:
getattr: __call__
None
<__main__.GetAttr object at 0xb728ff6c>
Почему не __getattr__
вызывается, когда attr == '__str__'
?
Это потому, что базовый класс object
уже реализует метод по умолчанию __str__
, и наша __getattr__
функции вызывается только для отсутствует атрибутов. Чтобы исправить пример, мы должны использовать метод __getattribute__
, но beware of the dangers.
class GetAttr(object):
def __getattribute__(self, attr):
print('getattr: ' + attr)
if attr == '__str__':
return lambda: '[Getattr str]'
else:
return lambda *args: None
А лучше и более читаемым решением было бы просто переопределить метод __str__
в явном виде.
Но, хотя это лучший питон, большая часть примера проиграна.