Size: a a a

2020 December 01

fs

falamous starstrider in #ctfchat
что значит привязанность?
значит что методу передастся self именно этот обьект
источник

v

vient in #ctfchat
фактически, метод объекта это такая же partial функция, у которой зафиксировано значение первого неявного параметра self
источник

v

vient in #ctfchat
vient
фактически, метод объекта это такая же partial функция, у которой зафиксировано значение первого неявного параметра self
это и есть привязанность, bound method
источник

R

Rubikoid in #ctfchat
vient
без partial ничего красивого в голову не приходит, чтобы не пришлось где-то снаружи хранить ссылку на оригинальную функцию
Как-то так. Просто, чтобы показать более явно, как partial работает

class A:
   def f(self, *args, **kwargs):
       print('A.f called', args, kwargs)

a = A()

def wrapper(orig_method, orig_object):
   def hook(*args, **kwargs):
       print("hook called")
       return orig_method(*args, **kwargs)
   return hook

a.f = wrapper(a.f, a)

a.f()
a.f(1, lol='kek')
источник

R

Rubikoid in #ctfchat
falamous starstrider
для этого вообще есть void *
эм лол?
источник

v

vient in #ctfchat
Rubikoid
Как-то так. Просто, чтобы показать более явно, как partial работает

class A:
   def f(self, *args, **kwargs):
       print('A.f called', args, kwargs)

a = A()

def wrapper(orig_method, orig_object):
   def hook(*args, **kwargs):
       print("hook called")
       return orig_method(*args, **kwargs)
   return hook

a.f = wrapper(a.f, a)

a.f()
a.f(1, lol='kek')
а, ну в этом плане
источник

R

Rubikoid in #ctfchat
partial, правда, позволяет фиксировать аргументы
источник

fs

falamous starstrider in #ctfchat
Rubikoid
Как-то так. Просто, чтобы показать более явно, как partial работает

class A:
   def f(self, *args, **kwargs):
       print('A.f called', args, kwargs)

a = A()

def wrapper(orig_method, orig_object):
   def hook(*args, **kwargs):
       print("hook called")
       return orig_method(*args, **kwargs)
   return hook

a.f = wrapper(a.f, a)

a.f()
a.f(1, lol='kek')
нет же
источник

fs

falamous starstrider in #ctfchat
ты не передаешь хуку селф
источник

v

vient in #ctfchat
угу, код не работает
источник

in #ctfchat
vient
фактически, метод объекта это такая же partial функция, у которой зафиксировано значение первого неявного параметра self
"значение первого неявного параметра self" ?
источник

R

Rubikoid in #ctfchat
falamous starstrider
ты не передаешь хуку селф
а, да, косяк
источник

v

vient in #ctfchat
"значение первого неявного параметра self" ?
ну, когда ты объявляешь метод, он явный, но передаётся неявно
источник

v

vient in #ctfchat
точнее, он не передаётся вообще, он фиксируется в момент создания экземпляра класса
источник

v

vient in #ctfchat
хм, я думал, id методов разных объектов будут разными, но это не так
источник

R

Rubikoid in #ctfchat
vient
хм, я думал, id методов разных объектов будут разными, но это не так
неоптимально же
источник

R

Rubikoid in #ctfchat
зачем их копировать каждый раз?
источник

v

vient in #ctfchat
то есть id(a.f) == id(b.f) но not (a.f is b.f) (в cpython)
источник

v

vient in #ctfchat
Rubikoid
зачем их копировать каждый раз?
ну я точно не знаю, как осуществляется привязка методов
источник

v

vient in #ctfchat
если как в partial, то было бы логично иметь разные id
источник