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()
被传递了一个论点?
答案 0 :(得分:1)
尝试将其定义为:
def fullname(self):
[...]
self
参数隐式传递给方法调用。它表示对在其上调用方法的对象的引用。
答案 1 :(得分:1)
请考虑以下内容:
def fullname():
return '{} {}'.format(self.first, self.last)
在上述方法中,变量self
在self.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)