Доступ к методам через getattrPython

Программы на Python
Ответить
Anonymous
 Доступ к методам через getattr

Сообщение Anonymous »

Я наткнулся на такое поведение, которое предполагает, что вы можете использовать getattr для вызова методов экземпляра класса в качестве альтернативы интуитивно названному оператору.methodcaller:

Код: Выделить всё

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
Мне хотелось бы внутренне понять, почему это работает. Это потому, что все методы также являются атрибутами? Это похоже, потому что dir(Foo) или dir(my_obj) включает «лето». Но я никогда не слышал, чтобы методы назывались атрибутами класса или экземпляра класса, например. это не упоминается в разделе «Что такое «метод» в Python?»

В документации есть объяснение, в котором упоминается различие между «атрибутами данных» и «не данными». атрибуты", которые я не понял.

Обновление: Комментарии @Amadan прояснили большую часть вышеизложенного. Единственное, что мне непонятно, это выдержка из документации:


Если вы все еще не понимаете, как работают методы, посмотрите в
реализации, возможно, может прояснить ситуацию. При ссылке на атрибут, не являющийся данными
экземпляра, выполняется поиск по классу экземпляра. Если
имя обозначает действительный атрибут класса, который является объектом функции,
объект метода создается путем упаковки (указателей на) объекта экземпляра
и объект функции, только что найденные вместе в абстрактном объекте:
это объект метода.

Атрибут, не являющийся данными, определяется путем проверки того, является ли он вызываемый, или есть какой-то другой способ определить, что это функциональный объект? Что означает «упаковка указателей» на объект экземпляра? Что такое абстрактный объект?

Подробнее здесь: https://stackoverflow.com/questions/518 ... ia-getattr
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Python»