python - 为什么 `object.__init__` 不带参数

标签 python python-3.x

为什么 object.__init__ 不将 *args, **kwargs 作为参数?据我所知,这以非常烦人的方式破坏了一些简单的代码,没有任何好处:

假设我们要确保调用所有父类的所有 __init__。只要每个 init 都遵循调用 super().__init__ 的简单约定,这将保证整个层次结构被运行并且恰好一次(也不必专门指定父级)。当我们传递参数时出现问题:

class Foo:
    def __init__(self, *args, **kwargs):
        print("foo-init")
        super().__init__(*args, **kwargs) # error if there are arguments!

class Bar:
    def __init__(self, *args, **kwargs):
        print("bar-init")
        super().__init__(*args, **kwargs)

class Baz(Bar, Foo):
    def __init__(self, *args, **kwargs):
        print("baz-init")
        super().__init__(*args, **kwargs)

b1 = Baz() # works
b2 = Baz("error")

这样做的原因是什么?最好的一般解决方法是什么(!在我的特定情况下很容易解决,但这依赖于对层次结构的额外了解)解决方法?我能看到的最好的是检查父对象是否是对象,在那种情况下不给它任何参数..非常丑陋。

最佳答案

可以看到http://bugs.python.org/issue1683368进行讨论。请注意,那里确实有人要求它导致错误。另见 the discussion on python-dev .

无论如何,你的设计很奇怪。为什么要编写每个类来采用未指定的 *args**kwargs?一般来说,最好让方法接受它们需要的参数。例如,如果有人输入错误的关键字名称,则对所有内容都接受开放式参数可能会导致各种错误。有时这是必要的,但它不应该是默认的做事方式。

关于python - 为什么 `object.__init__` 不带参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11234519/

相关文章:

python - 在 Python 中实时读取串行数据

python : template var without space

Python:基于另一列值的 CSV 文件中的平均值

Python 父子特定类结构

python - Python 中唯一的一组随机数字对

Python:在不是整数的字符串上使用 int()

python - Azure Blob PUT Rest api - 出现错误 "Signature fields not well formed"

Django 过滤器测试

python - Scipysolve_banded矩阵使用的求解方法

python-3.x - python 3 + 统计模型?