位置参数和self关键字

时间:2018-07-03 22:43:16

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

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

和其他一些事情,例如将{self}排除在fullname()的return语句之外。但是,每种更改方法都说错误是TypeError。因此,我很困惑,为什么fullname()被传递了一个论点?

3 个答案:

答案 0 :(得分:1)

尝试将其定义为:

def fullname(self):
    [...]

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

答案 1 :(得分:1)

请考虑以下内容:

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

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

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

答案 2 :(得分:0)

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

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

self将引用emp。 因此,您必须将self作为fullname的参数。

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