class can not deal with *args properly
我编写了一个类,其中有一个函数接受*args的多个输入,但是运行结果证明它只接受第二个输入的参数,就像self接受第一个输入一样,这里有一个简化的代码:
1 2 3 4 5 6 7
| class incorrect():
def itera(self, *args):
for i in args:
print(i)
a = incorrect
a.itera(12, 23, 34) |
输出12丢失:
有什么问题?我怎样才能解决这个问题?
- 对于一个明目张胆的离题拼写错误的问题,这些答案怎么会有如此多的赞成票?
- 因为在答案发布之前没有人找到副本?!)
- @我觉得这不是复制品…只是个打字错误
- @ C????S????好吧,stackoverflow.com/questions/17534345/…似乎是一个有效的重复目标…
- @ C????S????我不知道怎么找这样的问题,所以我决定回答。+5是有点可笑,不过对于这样一个简单的问题。
- @太好了,我已经把VTC列为非主题了,敬请谅解。
- @我希望我那半个得体的回答中的一些时不时能得到5张赞成票;-(
- @ C????S????IKR。我工作了半个小时才得到一个认可的答案;如果是这样的话。我想+5在一分钟之内就出现了。人们都很奇怪。
- 这不是一个打字错误,是吗?这可能是由于对语法的误解。
- @给任何一个带着无名英雄徽章的人开汽车都能欣赏你所说的话。人们真的可以…有时候很奇怪,因为"好答案"是多么主观。
- @是的,不是打字错误,直到那个问题…
- @我很好。如果我是你,我会回顾创建实例,即使这些答案有帮助。很重要的一件事就是要好好把握。
- @ C????S?????我越多地使用这个网站,我就越喜欢计时的作用。这是可悲的,但有时正是特朗普的品质。
- @Carcigenicate我们能花点时间来欣赏这样一个事实吗:我写的最普通的答案之一也是我投票最多的答案之一?X(
- @ C????S????是的,我不想评论,但是为了展示天花板和圆形的使用而得到91分是很不错的…慷慨大方。哦,好吧,我们有时都会收到。
这是因为你在课堂上使用它,所以self是12,args是[33, 34]。您可以通过创建实例来修复它:
1 2
| a = incorrect()
a.itera(12, 23, 34) |
或者您可以在签名中省略self,使用decorator @staticmethod:
1 2 3 4
| @staticmethod
def itera(*args):
for i in args:
print(i) |
或者你可以把它改成:
1 2 3 4
| @classmethod
def itera(cls, *args):
for i in args:
print(i) |
- 我没有投反对票,但你可以在函数内部"证明"你的论点。如果你在课堂上打电话的话,也可以详细说明为什么是self=12。
- 我想这不是你能提供的最好的解释。但无论如何都是对的。
- 不要省略self(不要这样做,如果您在实例中调用它,您会遇到类似的问题)将其设为@staticmethod。
- @如果你不使用staticmethod,你将省略self,你不使用classmethod。
- 我只是指你的"或者你可以在签名中省略自我"。这是坏建议。如果它不应该有self,它应该是一个静态方法;如果它应该有cls,它应该是一个类方法。
- @如果我得到你,我同意
您正在调用类本身的方法,而不是类的实例。创建实例,然后对其调用方法:
1 2
| a = incorrect() # Add () to create instance
a.itera(12, 23, 34) |
当您在类本身上调用它时,它充当一个静态方法,并且由于没有要传递的self,因此不再隐式传递self。