Есть ли механизм для вызова метода по ссылке и вызова метода правильного подкласса? - PullRequest
0 голосов
/ 12 ноября 2019

Я хочу вызвать метод с аргументами в экземпляре подкласса, учитывая ссылку на метод. Проблема: какой метод является динамическим и является одним из (несвязанных) методов родительского класса.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...