Код: Выделить всё
from operator import methodcaller
class Foo():
def __init__(self, lst):
self.lst = lst
def summer(self):
return sum(self.lst)
my_obj = Foo(range(11))
res1 = methodcaller('summer')(my_obj) # 55
res2 = getattr(my_obj, 'summer')() # 55
assert res1 == res2
В документации есть объяснение, в котором упоминается различие между «атрибутами данных» и «не данными». атрибуты", которые я не понял.
Обновление: Комментарии @Amadan прояснили большую часть вышеизложенного. Единственное, что мне непонятно, это выдержка из документации:
Если вы все еще не понимаете, как работают методы, посмотрите в
реализации, возможно, может прояснить ситуацию. При ссылке на атрибут, не являющийся данными
экземпляра, выполняется поиск по классу экземпляра. Если
имя обозначает действительный атрибут класса, который является объектом функции,
объект метода создается путем упаковки (указателей на) объекта экземпляра
и объект функции, только что найденные вместе в абстрактном объекте:
это объект метода.
Атрибут, не являющийся данными, определяется путем проверки того, является ли он вызываемый, или есть какой-то другой способ определить, что это функциональный объект? Что означает «упаковка указателей» на объект экземпляра? Что такое абстрактный объект?
Подробнее здесь: https://stackoverflow.com/questions/518 ... ia-getattr
Мобильная версия