【问题标题】:Python module, class, method basicksPython 模块、类、方法基础知识
【发布时间】:2015-11-20 12:20:16
【问题描述】:

我对 python 完全陌生,对我来说,我经历过奇怪的行为。我有两个文件:foo.py 和 test.py

test.py:

from foo import Foo
f = Foo()
f.bar(1)

当我的 foo.py 看起来像这样时:

class Foo:
    def bar(n):
        print n

我收到错误消息:

Traceback (most recent call last):
File "test.py", line 3, in <module>
f.bar(1)
TypeError: bar() takes exactly 1 argument (2 given)

当我的 foo.py 看起来像这样时:

class Foo:
    def bar(x,n):
        print n

我得到结果:

1

这是为什么呢?为什么我需要声明两个参数,即使我想要一个只需要一个的方法?谢谢

【问题讨论】:

  • 修正缩进。
  • 然后阅读一些基本的 Python 文档,应该可以充分解决这个问题。
  • 实例方法的第一个参数是对象本身。
  • 查看官方文档:A First Look at Classes
  • 在声明方法时,第一个参数是对类实例的引用,通常称为self。请参阅this Stackoverflow 问题。

标签: python class methods module


【解决方案1】:

方法中的第一个参数应该是调用该方法的对象。也就是说,当您调用f.foo(1) 时,这意味着将使用参数foo(f, 1) 调用foo。通常调用self 的第一个参数,但python 不关心名称,您的第二个示例对象f 将通过x 参数发送。

【讨论】:

    【解决方案2】:

    原因是 Python 期望第一个参数是调用函数的对象。如果您熟悉 C++ 或 Java,它类似于“this”关键字。只是 Python 更特别的是,您显式声明而不是隐式声明。标准编码约定建议您使用“self”作为第一个参数,但您可以使用任何真的。

    在你的例子中,

    from foo import Foo
    f = Foo()
    f.bar(1)
    

    当你调用 Foo 类中的函数 bar 时,它可以被称为 Foo.bar(f,n) 或 f.bar(n)。在这里,self 是 'f' 或者是指调用该类的当前对象。

    我建议查看Why explicit self has to stay 以获得更清晰的理解。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-04-16
      • 2018-05-25
      相关资源
      最近更新 更多