Я пишу контекстный менеджер, чтобы обернуть функцию builtins.print.И это прекрасно работает.Однако я столкнулся с поведением Python, которое не могу обернуть головой:
Всякий раз, когда метод класса назначается в переменную для последующего вызова, первый аргумент «self» также автоматически сохраняется ииспользуется для всех последующих вызовов.
Вот пример, иллюстрирующий точку:
import functools
class Wrapper:
def wrap(self):
return self._wrapped #functools.partial(self._wrapped, self)
def _wrapped(self, *args, **kwargs):
print('WRAPPED!', *args, **kwargs)
print('..knows about self:', self)
wrapped = Wrapper().wrap()
wrapped('expect self here', 'but', 'get', 'all', 'output')
Вывод:
WRAPPED! expect self here but get all output
..knows about self: <__main__.Wrapper object at 0x2aaaab2d9f50>
Конечно, для нормальных функций (вне классов)этой магии не бывает.Я даже могу назначить этот метод в вышеприведенном примере напрямую, не проходя инстанцирование:
wrapped = Wrapper._wrapped
wrapped('expect self here', 'but', 'get', 'all', 'output')
И теперь я получаю то, что сначала ожидал:
WRAPPED! but get all output
..knows about self: expect self here
В своем исходном коде я использовалfunctools.partial
до карри - в self
, но затем обнаружил, что это даже не требуется.
Мне нравится текущее поведение, но я пока не понимаю аргументацию относительно последовательности и "быть очевидным ".
Я работаю с Python 3.1.2 здесь.
этот вопрос с ответом на использование types.MethodType
связано?Поиск здесь и в сети в основном дает основную информацию о каррировании / частичных вызовах функций и упаковке / распаковке списков аргументов.Может быть, я использовал неадекватные поисковые термины (например, «методы каррирования в python»).
Может кто-нибудь пролить свет на это поведение?
Это то же самое в Py2 и Py3?