2016-01-25 2 views
0

В различных учебниках я видел, как он утверждал, что вызов метода с использованием instance.method() синтаксически эквивалентен Class.method(instance). Я также исследовать «метод связывания», что есть и официальные состояния питон документации:Разница между вызовом метода через Class.method (instance) и instance.method()

«Когда атрибут экземпляра ссылается, что не является атрибутом данных, ищется его класс Если имя означает действительное. class object , который является объектом функции, объект метода создается путем упаковки (указатели на) объекта экземпляра и только что найденного объекта функции в абстрактном объекте: это объект метода. Когда вызывается объект метода с списком аргументов, новый список аргументов - это , построенный из объекта экземпляра и списка аргументов, и функциональный объект является вызовом ed с этим новым списком аргументов. "

Исходя из этого описания, он появляется только синтаксис instance.method() приведет к «абстрактному объекту метода» создается, потому что 'атрибут экземпляра на который ссылается. Если это так, то как два выражения синтаксически эквивалентны?

+0

Будучи точным, они не являются синтаксически эквивалентными, так как они имеют другой синтаксис. Но они имеют тот же результат. С некоторыми шагами между ними 'instance.method()' вызывает 'class.method (instance)'. В конце концов, это просто плохое использование «синтаксиса». –

ответ

0

Поскольку создание этого абстрактного объекта является лишь промежуточным шагом. В цитате вы дали, конечный результат:

новый список аргументов конструируется из объекта экземпляра и списка аргументов, а объект вызывается функция с новым списком аргументов

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

+0

Хмм, я думаю, теперь понимаю. Так использует метод Class.method (экземпляр) технически «быстрее», потому что он пропускает промежуточный шаг создания абстрактного объекта и создания нового списка аргументов? –

+0

@ user2154633: Возможно, но почему вас это волнует? – BrenBarn

+0

Просто любопытно, как все это работает за кулисами. –