При вызове метода __getattr__, вызывается функция внутри нее

Почему при вызове метода getattr, вызывается функция внутри нее

class Interception:
    def __getattr__(self, attrname):
        print("Trace: " + attrname)
        return lambda x: x

<input> obj = Interception()
<input> obj.start
<output> Trace: start
         <lambda function>
<input> obj.start(5)
<output> Trace: start
         5

Если просто вызвать метод, он отлавливает не существующий аргумент, но при вызове его как функции он передает аргументы


Ответы (1 шт):

Автор решения: ganz

Изменим ваш код без анонимной функции для удобства:

class Interception:
    def __getattr__(self, attrname):
        print("Trace: " + attrname)
        def subfunc(c):
            print('called subfunc:',c)
            return 'from subfunc'
        return subfunc

a=Interception()
print(a.y)
print(a.z(999999999))

Который вернёт

Trace: y
<function Interception.__getattr__.<locals>.subfunc at 0x0000000001D06160>
Trace: z
called subfunc: 999999999
from subfunc

Как видно ваши ожидания с Z не совпали с действительностью. Тоесть gettatr так же возвращает функцию, и незамедлительно происходит её вызов.

print(a.тут_мы_получили_функцию('а здесь незамедлительно её вызываем'))
→ Ссылка