python – метод вызова вызова с использованием __func__

Я новичок в python, и я не совсем понимаю __func__ в python 2.7.

Я знаю, когда я определяю класс следующим образом:

 class Foo: def f(self, arg): print arg 

Я могу использовать Foo().f('a') или Foo.f(Foo(), 'a') чтобы вызвать этот метод. Однако я не могу назвать этот метод Foo.f(Foo, 'a') . Но я случайно обнаружил, что могу использовать Foo.f.__func__(Foo, 'a') или даже Foo.f.__func__(1, 'a') чтобы получить тот же результат.

Я печатаю значения Foo.f , Foo().f и Foo.f.__func__ , и они все разные. Однако в определении есть только один фрагмент кода. Кто может помочь объяснить, как работает код выше, особенно __func__ ? Теперь я действительно запутался.

One Solution collect form web for “python – метод вызова вызова с использованием __func__”

Когда вы Foo.f доступ к Foo.f или Foo().f возвращается метод ; он несвязан в первом случае и связан во втором. Метод python по существу является оберткой вокруг функции, которая также содержит ссылку на класс, которым является метод. При привязке он также содержит ссылку на экземпляр.

Когда вы вызываете метод, он проверит проверку первого переданного аргумента, чтобы убедиться, что это экземпляр (он должен быть экземпляром ссылочного класса или подкласса этого класса). Когда метод привязан, он предоставит этот первый аргумент по несвязанному методу, который вы предоставите ему сами.

Этот объект метода имеет атрибут __func__ , который является лишь ссылкой на завернутую функцию. Получая доступ к базовой функции вместо вызова метода, вы удаляете typecheck, и вы можете передать все, что хотите, в качестве первого аргумента. Функции не заботятся о своих типах аргументов, но методы делают.

Обратите внимание, что в Python 3 это изменилось; Foo.f просто возвращает функцию, а не несвязанный метод. Foo().f возвращает метод все еще, все еще привязанный, но нет способа создать несвязанный метод.

Под капотом каждый объект функции имеет метод __get__ , это то, что возвращает объект метода:

 >>> class Foo(object): ... def f(self): pass ... >>> Foo.f <unbound method Foo.f> >>> Foo().f <bound method Foo.f of <__main__.Foo object at 0x11046bc10>> >>> Foo.__dict__['f'] <function f at 0x110450230> >>> Foo.f.__func__ <function f at 0x110450230> >>> Foo.f.__func__.__get__(Foo(), Foo) <bound method Foo.f of <__main__.Foo object at 0x11046bc50>> >>> Foo.f.__func__.__get__(None, Foo) <unbound method Foo.f> 
Interesting Posts

Пассивный массив в N кусков с помощью Numpy

Числа Фибоначчи с memoization медленны в Python?

Простой способ измерения времени выполнения ячейки в ноутбуке ipython

Как я могу остановить запуск python.exe сразу после получения результата?

ошибка python Ubuntu установить Pillow 3.0.0

Профилирование расширений python C

Как интегрировать SQLAlchemy и подклассифицированный Numpy.ndarray плавно и в виде pythonic?

Функция вызова Python с пользовательского ввода

Написание процентов в Excel с использованием Pandas

Доступ к атрибутам на литералах работает на всех типах, но не `int`; Зачем?

Python: проблемы с производительностью с помощью islice

Как выбрать значение параметра раскрывающегося меню с помощью Selenium – Python

как сериализовать произвольные типы файлов для json string в python

Индексирование на Amazon Elasticsearch Service – массовая вставка

Что такое Pythonic способ сопоставить последовательность одного пользовательского класса другому?

Python - лучший язык программирования в мире.