gpt4 book ai didi

python - 如何有效地传递参数(python 中的**kwargs)

转载 作者:太空狗 更新时间:2023-10-29 17:41:33 24 4
gpt4 key购买 nike

我有一个继承自其他 2 个类的类。这些是基类:

class FirstBase(object):
def __init__(self, detail_text=desc, backed_object=backed_object,
window=window, droppable_zone_obj=droppable_zone_obj,
bound_zone_obj=bound_zone_object,
on_drag_opacity=on_drag_opacity):
# bla bla bla

class SecondBase(object):
def __init__(self, size, texture, desc, backed_object, window):
# bla bla bla

这是 child :

class Child(FirstBase, SecondBase):
""" this contructor doesnt work
def __init__(self, **kwargs):
# PROBLEM HERE
#super(Child, self).__init__(**kwargs)
"""
#have to do it this TERRIBLE WAY
def __init__(self, size=(0,0), texture=None, desc="", backed_object=None,
window=None, droppable_zone_obj=[], bound_zone_object=[],
on_drag_opacity=1.0):
FirstBase.__init__(self, detail_text=desc, backed_object=backed_object,
window=window, droppable_zone_obj=droppable_zone_obj,
bound_zone_obj=bound_zone_object,
on_drag_opacity=on_drag_opacity)
SecondBase.__init__(self, size, texture, desc, backed_object, window)

我想用 **kwargs 很好地解决这一切,但是当我调用第一个注释掉的构造函数时,我得到了 TypeError: __init__() got an unexpected keyword argument 'size'.

关于如何让它与 **kwargs 一起工作的任何想法?

最佳答案

您的问题是您只尝试在子类中使用 super

如果您也在基类中使用 super,那么这将起作用。每个构造函数都会“吃掉”它接受的关键字参数,而不会将它们传递给下一个构造函数。当调用 object 的构造函数时,如果遗留任何关键字参数,它将引发异常。

class FirstBase(object):
def __init__(self, detail_text=None, backed_object=None,
window=None, droppable_zone_obj=None,
bound_zone_obj=None, on_drag_opacity=None, **kwargs):
super(FirstBase, self).__init__(**kwargs)

class SecondBase(object):
def __init__(self, size=(0,0), texture=None, desc="",
backed_object=None, window=None, **kwargs):
super(SecondBase, self).__init__(**kwargs)

class Child(FirstBase, SecondBase):
def __init__(self, **kwargs):
super(Child, self).__init__(**kwargs)

如您所见,它有效,除非您传递了一个虚假的关键字参数:

>>> Child()
<__main__.Child object at 0x7f4aef413bd0>
>>> Child(detail_text="abc")
<__main__.Child object at 0x7f4aef413cd0>
>>> Child(bogus_kw=123)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "test.py", line 14, in __init__
super(Child, self).__init__(**kwargs)
File "test.py", line 5, in __init__
super(FirstBase, self).__init__(**kwargs)
File "test.py", line 10, in __init__
super(SecondBase, self).__init__(**kwargs)
TypeError: object.__init__() takes no parameters

关于python - 如何有效地传递参数(python 中的**kwargs),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13124961/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com