【问题标题】:class can not deal with *args properly [duplicate]类无法正确处理 *args [重复]
【发布时间】:2018-02-19 16:32:58
【问题描述】:

我写了一个类,其中有一个函数接受*args的多个输入,但是运行结果证明它只接受第二个参数,就像self接受第一个一样,这是一个简化的代码:

class incorrect():
    def itera(self, *args):
        for i in args:
            print(i)

a = incorrect
a.itera(12, 23, 34)

输出,12 丢失了:

23
34

有什么问题?我该如何解决?

【问题讨论】:

  • 这些答案如何在一个明显偏离主题的问题上获得如此多的赞成?
  • 因为在发布答案之前没有人发现重复项?! :)
  • @MSeifert 这不是重复的......这只是一个错字
  • @MSeifert Err,我已经把 VTC 作为题外话了,所以请尊重。
  • @cᴏʟᴅsᴘᴇᴇᴅ 是的,我不打算发表评论,但是因为使用天花板和圆形而获得 91 分是相当……慷慨的。哦,好吧,我们有时都会得到这些。

标签: python class


【解决方案1】:

那是因为你在课堂上使用了它,所以 self12args[33, 34]。您可以通过创建实例来修复它:

a = incorrect()
a.itera(12, 23, 34)

或者你可以在签名中省略self并使用装饰器@staticmethod

@staticmethod
def itera(*args):
    for i in args:
        print(i)

或者你也可以classmethod:

@classmethod
def itera(cls, *args):
    for i in args:
        print(i)

【讨论】:

  • 我没有投反对票,但你可以在函数内print(self) 来“证明”你的论点。如果您在课堂上调用它,也许还可以详细说明 为什么 self=12 :)
  • 我想这不是您可以提供的最佳解释。但无论如何它都是正确的。
  • 不要省略self(不要这样做,如果你在实例上调用它会遇到类似的问题)将其改为@staticmethod
  • @MSeifert 和staticmethod 你会省略self,你不要用classmethod 这样做
  • 我只是指您的“或者您可以在签名中省略 self ”。这是不好的建议。如果它不应该有self 它应该是一个静态方法,如果它应该有cls 它应该是一个类方法。
【解决方案2】:

您调用的是类本身的方法,而不是类的实例。创建一个实例,然后调用它的方法:

a = incorrect() # Add () to create instance
a.itera(12, 23, 34)

当您在类本身上调用它时,它充当静态方法,并且 self 不再隐式传递,因为 没有要传递的 self

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-03-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多