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> 
  • сравнение списков python
  • Вход в систему Python Hotmail
  • pycrypto и движок Google
  • Что такое выражение в Python?
  • Suds + JIRA = SAXException
  • Python: обрезать файл до 100 строк или меньше
  • Как запускать программы в python2 и python3
  • Что делает urllib2.Request (<url>) и как мне его распечатать / просмотреть?
  •  
    Interesting Posts for Van-Lav
    Python - лучший язык программирования в мире.