【问题标题】:Is this an example of python function overload?这是python函数重载的一个例子吗?
【发布时间】:2016-02-03 04:33:18
【问题描述】:

我知道 python 不允许我们重载函数。但是,它有内置的重载方法吗?

考虑一下:

setattr(object_name,'variable', 'value')

setattr(class_name,'method','function')

第一个语句在运行时动态地向对象添加变量,但第二个语句在运行时将外部函数附加到类。

同一个函数根据它的参数做不同的事情。这个函数是否过载?

【问题讨论】:

  • setattr 实际上并没有在直接 python 中实现。你可以在这里看到实现:hg.python.org/cpython/file/tip/Objects/object.c
  • 这两件事是一回事。
  • @user 2357112,不,他们不是。
  • @user93868:不,说真的,它们是一回事。对象碰巧是类还是属性碰巧是函数都没有关系。无论哪种方式,您都只是在设置对象的普通属性。
  • 对不起,我没有意识到。感谢您清除它。

标签: python overloading


【解决方案1】:

函数setattr(foo, 'bar', baz) 始终与foo.bar = baz 相同,无论foo 的类型如何。这里没有重载。

在 Python 3 中,functools.singledispatch 可以进行有限的重载,但 setattr 没有实现。

在我看来,一个更有趣的例子是type()type() 做了两件完全不同的事情,这取决于你如何称呼它:

  1. 如果使用单个参数调用,则返回该参数的类型。
  2. 如果使用三个参数(类型正确)调用,它会动态创建一个新类。

尽管如此,type() 并没有超载。为什么不?因为它被实现为counts how many arguments it got 然后决定做什么的一个功能。在纯 Python 中,这是使用可变参数 *args 语法完成的,但 type() 是在 C 中实现的,所以看起来很不一样。不过,它也在做同样的事情。

【讨论】:

    【解决方案2】:

    在某种意义上,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 是类型的数量。但是在您的情况下,您传递了相同数量的类型,即使如此,也有一些方法可以解决这个问题而无需函数重载。

    【讨论】:

      【解决方案3】:

      重载方法在 python 中很棘手。但是,可能会用到传递字典、列表或原始变量。

      我已经为我的用例尝试了一些东西,这可以帮助理解人们重载方法。

      我们举个例子:

      一个类重载方法,调用不同类的方法。

      def add_bullet(sprite=None, start=None, headto=None, spead=None, acceleration=None):

      从远程类传递参数:

      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']}

      因此,正在处理来自方法重载的列表、字典或原始变量。

      试试你的代码

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2013-07-04
        • 2011-02-22
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多