【问题标题】:How to make a class initializable with both positional and keyword arguments如何使用位置参数和关键字参数使类初始化
【发布时间】:2018-03-03 17:42:34
【问题描述】:

我正在尝试创建一个允许使用参数的默认值或传递给它的值进行初始化的类。此外,我希望能够将这些参数作为位置参数或关键字参数传递。它适用于关键字参数,但是,当我尝试使用任意数量的位置参数创建它时,如果我得到 TypeError: __init__() takes 1 positional argument but 2 were given

class Foo:
    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
        args_list = OrderedDict()
        args_list.update(x=1,
                        y=2,
                        z=3)
        args_list.update(kwargs)

        iter_args_list = enumerate(args_list)
        for positional_arg in args:
            (_, key_value) = next(iter_args_list)
            args_list[key_value] = positional_arg

        for argument_key, argument_value in args_list.items():
          setattr(self, argument_key, argument_value)

【问题讨论】:

  • 你得到什么类型的错误?请提供完整的追溯。
  • TypeError: __init__() takes 1 positional argument but 2 were given,编辑了主帖
  • 供将来参考:始终包含错误消息(和回溯)。显然有一个错误(否则你不会问问题),但它有助于显示你遇到了什么错误。

标签: python python-3.x class arguments


【解决方案1】:

问题可能是您将argskwargs 传递给super()object 不喜欢这样,因为object 不采用(命名或未命名)参数。所以你应该重写:

class Foo:
    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
        # ...

到:

class Foo:
    def __init__(self, *args, **kwargs):
        super().__init__()
        # ...

【讨论】:

  • 感谢您的回复,不幸的是它似乎没有帮助
  • @Cons:使用新错误和 full 回溯编辑您的问题。
  • @Cons:我认为Foo 有一个你不共享的超类。因此,无法调试它,因为您进行了super().__init__ 调用,因此我们至少需要该函数的签名。
  • 哦,我的错,它确实有效。现在的问题是我如何实际分配参数。它无法使用长度超过 1 个字符的关键字,但我想这是一个单独的问题
  • @Cons:你能提供你得到的错误吗?我设法构造了一个Foo(ab=2)
猜你喜欢
  • 2017-05-26
  • 1970-01-01
  • 2022-06-17
  • 1970-01-01
  • 2010-10-23
  • 1970-01-01
  • 1970-01-01
  • 2021-02-26
  • 2020-12-15
相关资源
最近更新 更多