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> 
  • Быстрый Pythonic способ превратить множество списков строк в списки поплавков при ловле ValueErrors
  • Выполнить установленный пакет Python как скрипт?
  • Как предотвратить блокирование блока кода с помощью KeyboardInterrupt в Python?
  • Learning Python: печатать переменную внутри функции из другой функции
  • переименовывать файлы в zip-папке с помощью zipmodule
  • Обнаружение выключения компьютера / программы в Python?
  • Удалить буквы из строки
  • Проверка объекта модели Python
  • Создайте объект python, доступ к которому можно получить с помощью квадратных скобок
  • Почему Python компилирует модули, но не запускает скрипт?
  • В Python в Google App Engine, как вы извлекаете вывод, созданный оператором печати?
  •  
    Interesting Posts for Van-Lav

    Как избежать бесконечной рекурсии с помощью super ()?

    CLI, который представляет собой совокупность двух других опций и приоритетов в python

    Python Эквивалент phpinfo ()

    Безопасная операция копирования с использованием атомного файла

    Как временно изменить формат зарегистрированных сообщений в Python?

    Создание новых ящиков ввода с кнопкой Tkinter

    Исключения в python как атрибуты класса плохо?

    Каков самый простой способ добавить гиперссылку на элемент canvas в ReportLab?

    Использование регулярного выражения для запятой выделяет большое количество в системе нумерации южной Азии

    Python разделяет текст на предложения

    Получение унаследованных объектов модели в django

    Python Shapely пересечение: параллельные плоскости

    Разработка плагина Gedit в Python

    Почему gevent.spawn не выполняет параметризованную функцию до вызова Greenlet.join?

    Python перемещает файлы и каталоги из одной папки в другую

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