Мне любопытно, возможно ли эмулировать нормальный вызов super().method()
для вызова "родителя" method()
, но с использованием singledispatch
вместо полиморфизма метода.
Насколько я могускажите, ответ "нет". Я не думаю, что индексирование в MRO является жизнеспособным решением, но может быть неправильным.
from functools import singledispatch
class A:
pass
class B(A):
pass
@singledispatch
def f(obj):
raise NotImplementedError(obj)
@f.register(A)
def _(obj):
print('A')
@f.register(B)
def _(obj):
print('B')
f.dispatch(super(B, obj))
b = B()
# I want this to print "B" then "A"
f(b)
Вывод
B
Traceback (most recent call last):
File "main.py", line 29, in <module>
f(b)
File "/usr/local/lib/python3.7/functools.py", line 840, in wrapper
return dispatch(args[0].__class__)(*args, **kw)
File "main.py", line 24, in _
f.dispatch(super(B, obj))
File "/usr/local/lib/python3.7/functools.py", line 795, in dispatch
impl = dispatch_cache[cls]
File "/usr/local/lib/python3.7/weakref.py", line 396, in __getitem__
return self.data[ref(key)]
TypeError: cannot create weak reference to 'super' object