当前位置: 首页 > 面试题库 >

为什么不能在子类的__init__中传递* args和** kwargs

鲁博雅
2023-03-14
问题内容

为了理解 args和* kwargs,当我遇到这个问题时,我进行了一些搜索* args和**
kwargs?

所选答案下方的答案引起了我的注意,这是:

class Foo(object):
    def __init__(self, value1, value2):
    # do something with the values
        print value1, value2

class MyFoo(Foo):
    def __init__(self, *args, **kwargs):
    # do something else, don't care about the args
        print 'myfoo'
        super(MyFoo, self).__init__(*args, **kwargs)

我在此示例上尝试了一些操作,并以这种方式运行代码

class Foo(object):
    def __init__(self, value1, value2):
    # do something with the values
        print 'I think something is being called here'
        print value1, value2


class MyFoo(Foo):
    def __init__(self, *args, **kwargs):
    # do something else, don't care about the args
        print args, kwargs
        super(MyFoo, self).__init__(*args, **kwargs)


foo = MyFoo('Python', 2.7, stack='overflow')

我懂了:

[...]
    super(MyFoo, self).__init__(*args, **kwargs)
TypeError: __init__() got an unexpected keyword argument 'stack'

变像 super(MyFoo, self).__init__(args, kwargs)

结果是:

('Python', 2.7) {'stack': 'overflow'}
I think something is being called here
('Python', 2.7) {'stack': 'overflow'}

出于某些头脑混乱的原因,我对此提出质疑:上面的示例中是对还是错?现实生活中将允许做什么,而在现实生活中不允许做什么?


问题答案:

Foo.__init__()不会 支持任意关键字参数。您可以添加**kw其签名以使其接受它们:

class Foo(object):
    def __init__(self, value1, value2, **kw):
       print 'I think something is being called here'
       print value1, value2, kw

关键字参数仅与关键字名称完全匹配的参数匹配;您的Foo方法将需要具有Pythonstack关键字参数。如果找不到匹配的关键字参数,但**kw参数
,则将它们收集在该参数中。

如果您的子类知道父类仅具有 位置 参数,则可以随时传递位置:

class MyFoo(Foo):
    def __init__(self, *args, **kwargs):
    # do something else, don't care about the args
        print args, kwargs
        while len(args) < 2:
            args += kwargs.popitem()
        super(MyFoo, self).__init__(*args[:2])

现在您 必须 在其中传递两个或多个参数才能MyFoo使调用正常工作。

本质上,super().methodname返回对bound方法的引用;从那里开始,这是一个 普通 方法,因此您需要传入 任何
方法都可以接受的参数。如果您的方法不接受关键字参数,则会出现异常。



 类似资料:
  • 问题内容: 我认为您可以在类中定义“ ”或“ ”,但是为什么都在django.utils.datastructures.py中定义。 我的代码: datastructures.py: 以及将在什么情况下致电。 谢谢 问题答案: 您可以定义一个或两个的和。 必须返回一个对象- 可以是一个新对象(通常将任务委派给该对象),一个现有对象(以实现单例,从池中“回收”实例,依此类推),甚至可以 不是 一个实

  • 问题内容: 我有以下定义: 我尝试按如下方式调用它,但收到错误消息: 这符合: 问题答案: 该相关转到FAQ中指出,和«别在内存相同的表示»。 要了解原因,让我们剖析两件事: 切片是一个后备存储阵列,外加几个包含切片大小和容量的整数。 在Go中,数组并不是某种意义上的“高级”。相反,它们包含的元素的布局是严格定义的:它们全部包含在内存的相邻区域中,彼此相邻。 这意味着,在切片的支持数组中,元素是类

  • 问题内容: 为什么此代码无法编译? 为什么我不能将类变量传递给? 问题答案: 该操作符对引用类型,像,而不是对象,如。您可能想要类似 旁注:如果编写,您的代码将更加简洁 但是,我不确定是否需要某种方法。

  • 问题内容: 在Python中,用于初始化不可变类型,通常用于初始化可变类型。如果将其从语言中删除,该怎么办(轻松)? 例如, 可以这样重写: 为澄清问题的范围:这不是一个问题关于如何以及是使用或它们之间有什么区别。这是一个问题,如果从语言中删除将会发生什么。有什么坏事吗?事情会变得很难或不可能吗? 问题答案: 您可以在中进行的所有操作都可以在中完成。 那么,为什么要使用? 因为您不必将实例存储在变

  • 我读了一些关于如何使用log4j的文章。他们中的大多数给出以下代码作为开始: 或 这将初始化记录器对象。但是我的问题是为什么需要发送类类型作为参数?似乎当我使用记录器时,我不在乎在哪个类中使用它。所以类类型似乎对记录器没有影响。如果我声明一个记录器为静态和公共的,我可以在另一个类中调用这个记录器,那么作者这样设计它的意图是什么?当我使用记录器时,类类型会绑定一些东西吗?或者我可以发送任何类类型到g

  • 问题内容: 我知道String [] args是作为参数传递给main的字符串数组。 但是,当您不将其包含为参数时(即使您不使用它),它也会引发异常。那么为什么需要它呢?另外,为什么不能是int []或boolean []? 问题答案: 这是一个字符串,因为命令行以文本形式表示。如果要将文本转换为整数或布尔值,则必须自己做- 操作系统或Java引导程序如何确切知道您希望如何解析所有内容?我想Jav