【问题标题】:Positional arguments and the self keyword位置参数和 self 关键字
【发布时间】:2018-12-12 07:19:36
【问题描述】:
class Employee:

    def __init__(self, first, last):
        self.first = first
        self.last = last

    def fullname():
        return '{} {}'.format(self.first, self.last)

emp = Employee('Rob', 'M')

print (emp.fullname())

你会注意到我在 fullname 方法中遗漏了 self 关键字,所以我得到:

TypeError: fullname() takes 0 positional arguments but 1 was given

这实际上是一个参数错误吗?我的猜测是否定的,所以我尝试了:

class Employee:

    def __init__(foo, first, last):
        foo.first = first
        foo.last = last

    def fullname():
        return '{} {}'.format(self.first, self.last)

emp = Employee('rob', 'm')

print(emp.fullname())

还有一些其他的事情,例如在fullname() 中将 self 排除在 return 语句之外。但是,每种更改方法都表示错误是TypeError。所以我很困惑,为什么fullname() 被传递了一个参数?

【问题讨论】:

  • 你忘记了self。 (此外,在发布代码时,请确保它与您实际运行的内容完全匹配,包括缩进。您可以通过将代码复制粘贴到问题框中来做到这一点,选择您粘贴的所有内容(包括预览中看起来不错的部分) ,然后按 Ctrl-K。)
  • 在您发布的表单中,您的代码包含几个缩进错误,这些错误会导致与您报告的错误不同。
  • 重要的是要意识到self 不是 Python 中的关键字。唯一的约定是将方法的第一个参数命名为self。如果您愿意,您可以使用不同的名称(尽管您通常不应该这样做,因为这会使您的代码对其他程序员更加困惑)。

标签: python python-3.x python-object


【解决方案1】:

考虑以下几点:

def fullname():
    return '{} {}'.format(self.first, self.last)

上述方法中,self.first中的变量self指的是什么?当您输入self 时,Python 如何知道您的意思?

所有方法都隐式传递其父对象作为它们的第一个参数,就像sys.argv[0] 始终是脚本名称一样。这样self.first 之类的东西就可以工作了。

【讨论】:

  • 那么 fullname(self) 期待一个对象的实例吗?在这种情况下是emp。那么它所指的位置参数是 Employee 本身的实际实例?
  • @Rob 是的。
【解决方案2】:

尝试将其定义为:

def fullname(self):
    [...]

self 参数被隐式传递给方法调用。它表示对调用该方法的对象的引用。

【讨论】:

    【解决方案3】:

    在python中,类方法的第一个参数是指类的当前实例。例如,如果您使用 Employee 类创建一个 emp 对象:

    emp = Employee('Rob', 'M')
    

    self 将引用 emp。 所以你必须将self 作为fullname 的参数传递。

    def fullname(self): return '{} {}'.format(self.first, self.last)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2023-03-31
      • 2012-11-21
      • 2020-11-18
      • 1970-01-01
      • 2021-02-26
      • 2017-06-29
      • 1970-01-01
      相关资源
      最近更新 更多