为什么更多主流的静态类型语言不支持返回类型的函数/方法重载?我想不出那样做.通过参数类型支持过载似乎没有那么有用或合理.怎么这么不受欢迎呢?
programming-languages overloading language-design function-calls
我知道Python不支持方法重载,但我遇到了一个问题,我似乎无法以一种漂亮的Pythonic方式解决这个问题.
我正在制作一个角色需要射击各种子弹的游戏,但是如何编写不同的功能来制作这些子弹呢?例如,假设我有一个函数可以创建一个以给定速度从A点到B点行进的子弹.我会写一个这样的函数:
def add_bullet(sprite, start, headto, speed):
... Code ...
Run Code Online (Sandbox Code Playgroud)
但我想写其他功能来创建子弹,如:
def add_bullet(sprite, start, direction, speed):
def add_bullet(sprite, start, headto, spead, acceleration):
def add_bullet(sprite, script): # For bullets that are controlled by a script
def add_bullet(sprite, curve, speed): # for bullets with curved paths
... And so on ...
Run Code Online (Sandbox Code Playgroud)
等等有很多变化.有没有更好的方法来做到这一点,而不使用这么多的关键字参数导致它快速变得有点难看.重命名每个功能,因为你要么是非常糟糕过add_bullet1,add_bullet2或add_bullet_with_really_long_name.
要解决一些问题:
不,我无法创建Bullet类层次结构,因为它太慢了.管理项目符号的实际代码在C中,我的函数是围绕C API的包装器.
我知道关键字参数,但检查各种参数组合变得烦人,但默认参数有助于分配 acceleration=0
我问这个问题是因为对这个答案的评论主题进行了讨论.我90%的方式来绕过它.
In [1]: class A(object): # class named 'A'
...: def f1(self): pass
...:
In [2]: a = A() # an instance
Run Code Online (Sandbox Code Playgroud)
f1 存在三种不同的形式:
In [3]: a.f1 # a bound method
Out[3]: <bound method a.f1 of <__main__.A object at 0x039BE870>>
In [4]: A.f1 # an unbound method
Out[4]: <unbound method A.f1>
In [5]: a.__dict__['f1'] # doesn't exist
KeyError: 'f1'
In [6]: A.__dict__['f1'] # a function
Out[6]: <function __main__.f1>
Run Code Online (Sandbox Code Playgroud)
绑定方法,未绑定方法和函数对象之间的区别是什么,所有这些都由f1描述?如何调用这三个对象?他们怎么能相互转化?关于这些东西的文档很难理解.
在编写单元测试时,我有时剪切并粘贴测试,不记得更改方法名称.这导致覆盖先前的测试,有效地隐藏它并阻止它运行.例如;
class WidgetTestCase(unittest.TestCase):
def test_foo_should_do_some_behavior(self):
self.assertEquals(42, self.widget.foo())
def test_foo_should_do_some_behavior(self):
self.widget.bar()
self.assertEquals(314, self.widget.foo())
Run Code Online (Sandbox Code Playgroud)
在这种情况下,只会调用后一个测试.是否有一种以编程方式捕获此类错误的方法,而不是直接解析原始源代码?