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

以及其他一些事情,例如将 self 排除在fullname(). 但是,每种更改方法都表示错误是TypeError. 所以我很困惑,为什么fullname()要传递一个论点?

4

3 回答 3

1

尝试将其定义为:

def fullname(self):
    [...]

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

于 2018-07-03T22:45:25.370 回答
1

考虑以下:

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

在前面的方法中,变量self是指self.first什么?当你键入时,Python 是如何知道你的意思的self

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

于 2018-07-03T22:51:30.877 回答
0

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

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

self将参考emp。所以你必须self作为fullname.

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

于 2018-07-03T23:23:34.090 回答