Size: a a a

2020 December 01

R

Rubikoid in #ctfchat
а зачем?
Так хочется же наследование))

Например, я это юзал при реализации/использовании каких-нибудь списков
Есть структура с, условно, указателями на следующий и предыдущие элементы.
Дальше она запихивается первым элементом в структуру, которая содержит полезные данные, и дальше работает магия памяти
источник

fs

falamous starstrider in #ctfchat
и выдать ошибку
нет
источник

fs

falamous starstrider in #ctfchat
почему же
источник

R

Rubikoid in #ctfchat
vient
можно прозрачно захукать метод, например
class A:
   def f(self, *args, **kwargs):
       print('A.f called', args, kwargs)

a = A()

def f(orig_method, self, *args, **kwargs):
   print("hook called")
   orig_method(*args, **kwargs)

import functools
a.f = functools.partial(f, a.f, a)

a.f()
a.f(1, lol='kek')
Блин, пример с partial не такой прозрачный
источник

in #ctfchat
Rubikoid
Так хочется же наследование))

Например, я это юзал при реализации/использовании каких-нибудь списков
Есть структура с, условно, указателями на следующий и предыдущие элементы.
Дальше она запихивается первым элементом в структуру, которая содержит полезные данные, и дальше работает магия памяти
типа линкуешь лист с нодой другого листа?
источник

fs

falamous starstrider in #ctfchat
vient
в Lua ещё круче, там вообще нет понятия класса (насколько я понимаю)
ну от этого там костыли для классических классов вроде
источник

fs

falamous starstrider in #ctfchat
ровно как в js
источник

v

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

v

vient in #ctfchat
или в каком плане не прозрачный
источник

R

Rubikoid in #ctfchat
типа линкуешь лист с нодой другого листа?
нет
структура A содержит
A* prev;
A* next;
Структура B просто содержит A base; и всё, что надо для структуры B.
В итоге все функи, которые работают со структурой A - спокойно работают с кастом (A*) b
источник

in #ctfchat
vient
можно прозрачно захукать метод, например
class A:
   def f(self, *args, **kwargs):
       print('A.f called', args, kwargs)

a = A()

def f(orig_method, self, *args, **kwargs):
   print("hook called")
   orig_method(*args, **kwargs)

import functools
a.f = functools.partial(f, a.f, a)

a.f()
a.f(1, lol='kek')
т.е тут тебе в функцию передается объект, который будет содержать ссылку на метод класса?
источник

v

vient in #ctfchat
в какую функцию
источник

fs

falamous starstrider in #ctfchat
Rubikoid
Блин, пример с partial не такой прозрачный
def partial(f, *pargs, **pkwargs):
   return lambda *args, **kwargs : f(*pargs, **pkwargs, *args, **kwargs)
?
источник

in #ctfchat
def f
источник

in #ctfchat
Rubikoid
нет
структура A содержит
A* prev;
A* next;
Структура B просто содержит A base; и всё, что надо для структуры B.
В итоге все функи, которые работают со структурой A - спокойно работают с кастом (A*) b
А, прикольно
источник

fs

falamous starstrider in #ctfchat
Rubikoid
Так хочется же наследование))

Например, я это юзал при реализации/использовании каких-нибудь списков
Есть структура с, условно, указателями на следующий и предыдущие элементы.
Дальше она запихивается первым элементом в структуру, которая содержит полезные данные, и дальше работает магия памяти
странное наследование
источник

v

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

fs

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

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

in #ctfchat
то, что оно якобы  относится к классу?
источник