位置参数和 self 关键字

Positional arguments and the self keyword

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())

您会注意到我在全名方法中省略了 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() 被传递了一个参数?

尝试将其定义为:

def fullname(self):
    [...]

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

考虑以下几点:

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

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

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

在 python 中,class 方法的第一个参数引用 class 的当前实例。例如,如果您使用 Employee class:

创建一个 emp 对象
emp = Employee('Rob', 'M')

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

的参数

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