编程语言
首页 > 编程语言> > python中的动态调度和继承

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