Я хочу вызвать метод с аргументами в экземпляре подкласса, учитывая ссылку на метод. Проблема: какой метод является динамическим и является одним из (несвязанных) методов родительского класса.
class Parent:
def method(self, x):
print(f'Parent:foo called with {x}')
def another(self, x):
pass
class Child(Parent):
def method(self, x):
print(f'Child:foo called with {x}')
def another(self, x):
pass
# Change this
def problem_func(target: Parent, ref):
meth, args = ref
meth(target, args)
c = Child()
# Change this too
ref = (Parent.method, 42)
problem_func(c, ref)
Приведенный выше вывод «Parent: foo вызывается с 42». Мне бы хотелось решение, которое печатает 'Child: foo вызывается с 42'.
По сути, мне нужен способ привязать метод к экземпляру и заставить его следовать правилам наследования Python / MRO. Еще лучше, я хотел бы завершить это и некоторые аргументы, но это может быть слишком много, чтобы спросить.
Очевидно, я мог бы изменить ref на (Child.method, 42)
, но это побеждает цель. Дело в том, что есть несколько подклассов Parent, и я буду перебирать их список, и я хочу применить ко всем им один и тот же метод (с соответствующим переопределенным поведением).
Одно решение Iнашел заменить meth(target, args)
на getattr(target, meth.__name__)(args)
. Я ищу встроенный ответ.
Редактировать: по сути, я ищу эквивалент указателей на члены из C ++. Смотри https://stackoverflow.com/a/60023/6518334