Спасибо за ваш интерес.
Метод __getattr__http://u.to/vi83Bg вызывается, если не найден подходящий метод (свойство) в объекте или в классах родителях. И, следовательно, он должен вернуть либо значение, если это свойство объекта или, так называемый, callable объект, что и просходит в нашем случаи. Этот callable объект и будет вызываться с параметрами. Пример ниже.
wialon_api = Wialon()
result = wialon_api.core_login(user='wialon_test', password='test')
Т.е. в цепочка вызова будет такая:
- __getattr__(self, 'core_login') - который и должен вернуть callable объект - назовем его callable_login
- вызовется callable_login в который, собственно, и передастся параметры user и password в словаре.
Вот для того, что бы __getattr__ и вернул callable объект и нужна нижеуказанная манипуляция.
def __getattr__(self, action_name):
"""
Enable the calling of Wialon API methods through Python method calls
of the same name.
"""
def get(self, *args, **kwargs):
return self.call(action_name, *args, **kwargs)
return get.__get__(self)
Про __get__ можно почитать по ссылке http://u.to/lTA3Bg.
А по поводу вызова напрямую:
def __getattr__(self, action_name):
return self.call
В таком случаи в метод call ни как не передается action_name. Можно было бы сделать это так:
from functools import partial
def __getattr__(self, action_name):
return partial(self.call, action_name)
Но мне, как автору, решение, которое и реализовано, показалось более прозначным и близким
Надеюсь вам стало понятнее.