python中的动态调度和继承
作者:互联网
我正在尝试修改Guido的多方法(动态调度代码):
http://www.artima.com/weblogs/viewpost.jsp?thread=101605
处理继承和可能的乱序参数.
例如(继承问题)
class A(object):
pass
class B(A):
pass
@multimethod(A,A)
def foo(arg1,arg2):
print 'works'
foo(A(),A()) #works
foo(A(),B()) #fails
有没有比迭代检查每个项目的super()更好的方法,直到找到一个?
例如(论证排序问题)
从碰撞检测的角度来看,我正在考虑这个问题.
例如
foo(Car(),Truck()) and
foo(Truck(), Car()) and
应该触发
foo(Car,Truck) # Note: @multimethod(Truck,Car) will throw an exception if @multimethod(Car,Truck) was registered first?
我正在寻找一个“优雅”的解决方案.我知道我可以通过所有可能性来强行实施,但我试图避免这种情况.我只想在坐下来寻找解决方案之前得到一些意见/想法.
谢谢
解决方法:
super()返回一个代理对象,而不是父类(因为你可以有多个继承),所以这不起作用.使用isinstance()是最好的选择,尽管没有办法使它像使用类型(arg)的字典查找一样优雅.
我不认为允许替代论证排序是一个好主意;它容易导致令人讨厌的惊喜,并使其与继承兼容也将是一个令人头痛的问题.但是,如果所有参数都是A类型,则使用“使用此函数”或者“如果所有参数都在类型{A,B,E}中使用此函数”,那么制作第二个装饰器将非常简单.
标签:python,dynamic-dispatch 来源: https://codeday.me/bug/20190626/1297673.html