【问题标题】:Python class missing positional argumentPython 类缺少位置参数
【发布时间】:2013-10-15 06:43:17
【问题描述】:

我有一个类,我想初始化一些变量,然后在其他函数中使用它们。

class TamAccConnect2: 
    def __init__( self ):
        self.deviceName = []
    def func1(self):
        device1 = 567;
        self.deviceName = 56756
        self.device = device1;
        print('No, you called me!')
    def ReadCurrentData():
        errorCode = 1;
        return errorCode;

>>> TamAccConnect2.func1()
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: func1() missing 1 required positional argument: 'self'

为什么会出现这样的错误,我已经以类似的方式创建了其他类,它们都很好。

【问题讨论】:

  • @millimoose:OP 不是在成绩单最后显示了这一点吗?
  • @DSM 成绩单是 Games Brainiac 的编辑,在帖子的原始版本中不太清楚。
  • @ErikAllik:虽然 PEP 8 对任何 Python 开发人员都很有用,但我不确定它在这里有什么帮助。他对类、self 参数、func1 方法名称和 4 空格缩进等使用 PEP 8 命名约定。确实,他有其他个地方违反了 PEP 8,但代码有比这更大的问题……
  • @abarnert:他还有一个名为ReadCurrentData 的方法,并且使用了分号和多余的空格。

标签: python


【解决方案1】:

你不能在类本身上调用实例方法;您必须创建一个实例,然后在该实例上调用该方法:

>>> connect2 = TamAccConnect2()
>>> connect2.func1()

当您尝试调用其他方法ReadCurrentData 时,您将遇到类似但相反的问题。因为您没有给它一个self 参数,所以当您尝试在一个实例上调用它时,您会得到一个TypeError 关于太多很多 参数,而不是太少。 (此外,您可能一直期望 ReadCurrentData 更新类、实例或全局变量,而不是创建一个在方法完成后立即消失的局部变量。)

虽然我们正在这样做,但如果这是 Python 2.x,您应该始终通过显式继承 object 来定义新样式类——例如,class TamAccConnect2(object):

在 SO 答案中很难比在教程中更好地解释所有这些,因此请重新阅读官方教程的 Classes 部分,或您正在学习的任何其他教程或文本。


如果您以类似的方式创建了其他类,它们就不好了。您可能因为其他错误取消了这个错误而侥幸逃脱(例如,您在不应该有的时候传递了一个参数,并且该方法从未使用它的self,或者以它发生的方式使用它使用您传递的参数),但它实际上并没有按预期工作。


如果您想知道为什么错误消息看起来像这样,那就有点复杂了。我试图写一个温和的解释here,但我怀疑它仍然很难理解。无论如何,简短的版本是您没有传递参数以匹配 self 参数,并且您没有调用绑定方法,该方法会自动将其绑定的对象作为参数传递以匹配 self 参数,所以你会得到一个错误,说你缺少 self 参数。

【讨论】:

    猜你喜欢
    • 2018-09-06
    • 2020-06-17
    • 2022-01-06
    • 1970-01-01
    • 1970-01-01
    • 2017-03-18
    • 2021-12-05
    • 2021-12-25
    • 2023-03-22
    相关资源
    最近更新 更多