这是 python 函数重载的例子吗?
Is this an example of python function overload?
我知道 python 不允许我们重载函数。但是,它有内置的重载方法吗?
考虑一下:
setattr(object_name,'variable', 'value')
setattr(class_name,'method','function')
第一个语句在 运行 时间动态地向对象添加变量,但第二个语句在 运行 时间将外部函数附加到 类。
同一个函数根据其参数做不同的事情。这个函数重载了吗?
无论 foo 的类型如何,函数 setattr(foo, 'bar', baz)
始终与 foo.bar = baz
相同。这里没有重载。
在 Python 3 中,functools.singledispatch
可以实现有限的重载,但是 setattr
没有实现。
在我看来,一个更有趣的例子是 type()
。 type()
根据您的称呼方式做两种完全不同的事情:
- 如果使用单个参数调用,它 returns 该参数的类型。
- 如果使用三个参数(正确类型)调用,它会动态创建一个新的 class。
尽管如此,type()
并没有超载。为什么不?因为它被实现为 counts how many arguments it got 然后决定做什么的一个功能。在纯 Python 中,这是使用可变参数 *args
语法完成的,但是 type()
是在 C 中实现的,因此看起来很不一样。不过,它在做同样的事情。
Python,在某种意义上,不需要其他语言需要的函数重载能力。考虑以下 C:
中的示例
int add(int x, int y) {
return x + y;
}
如果您希望扩展概念以包含非整数的内容,您需要创建另一个函数:
float add(float x, float y) {
return x + y;
}
在Python中,您只需要:
def add(x, y):
return x + y
它对两者都适用,并且不被视为函数重载。您还可以使用 isinstance
等方法处理变量类型的不同情况。主要问题 as pointed out by this question 是类型的数量。但是在您的情况下,您传递了相同数量的类型,即使如此,也有一些方法可以避免函数重载。
重载方法在 python 中很棘手。但是,可以使用传递字典、列表或原始变量。
我已经为我的用例尝试了一些东西,这可能有助于理解人们重载方法。
举个例子:
一个 class 重载方法,从不同 class.
调用方法
def add_bullet(sprite=None, start=None, headto=None, spead=None, acceleration=None):
从远程传递参数 class:
add_bullet(sprite = 'test', start=Yes,headto={'lat':10.6666,'long':10.6666},accelaration=10.6}
或add_bullet(sprite = 'test', start=Yes,headto={'lat':10.6666,'long':10.6666},speed=['10','20,'30']}
因此,正在通过方法重载实现对列表、字典或原始变量的处理。
尝试使用您的代码
我知道 python 不允许我们重载函数。但是,它有内置的重载方法吗?
考虑一下:
setattr(object_name,'variable', 'value')
setattr(class_name,'method','function')
第一个语句在 运行 时间动态地向对象添加变量,但第二个语句在 运行 时间将外部函数附加到 类。
同一个函数根据其参数做不同的事情。这个函数重载了吗?
无论 foo 的类型如何,函数 setattr(foo, 'bar', baz)
始终与 foo.bar = baz
相同。这里没有重载。
在 Python 3 中,functools.singledispatch
可以实现有限的重载,但是 setattr
没有实现。
在我看来,一个更有趣的例子是 type()
。 type()
根据您的称呼方式做两种完全不同的事情:
- 如果使用单个参数调用,它 returns 该参数的类型。
- 如果使用三个参数(正确类型)调用,它会动态创建一个新的 class。
尽管如此,type()
并没有超载。为什么不?因为它被实现为 counts how many arguments it got 然后决定做什么的一个功能。在纯 Python 中,这是使用可变参数 *args
语法完成的,但是 type()
是在 C 中实现的,因此看起来很不一样。不过,它在做同样的事情。
Python,在某种意义上,不需要其他语言需要的函数重载能力。考虑以下 C:
中的示例int add(int x, int y) {
return x + y;
}
如果您希望扩展概念以包含非整数的内容,您需要创建另一个函数:
float add(float x, float y) {
return x + y;
}
在Python中,您只需要:
def add(x, y):
return x + y
它对两者都适用,并且不被视为函数重载。您还可以使用 isinstance
等方法处理变量类型的不同情况。主要问题 as pointed out by this question 是类型的数量。但是在您的情况下,您传递了相同数量的类型,即使如此,也有一些方法可以避免函数重载。
重载方法在 python 中很棘手。但是,可以使用传递字典、列表或原始变量。
我已经为我的用例尝试了一些东西,这可能有助于理解人们重载方法。
举个例子:
一个 class 重载方法,从不同 class.
调用方法def add_bullet(sprite=None, start=None, headto=None, spead=None, acceleration=None):
从远程传递参数 class:
add_bullet(sprite = 'test', start=Yes,headto={'lat':10.6666,'long':10.6666},accelaration=10.6}
或add_bullet(sprite = 'test', start=Yes,headto={'lat':10.6666,'long':10.6666},speed=['10','20,'30']}
因此,正在通过方法重载实现对列表、字典或原始变量的处理。
尝试使用您的代码