我对Python Classes很陌生,我想测试一个简单的代码:
class information:
def __init__(self,fname,lname):
self.fname = fname
self.lname = lname
def first(self):
print ("First name :", self.fname)
def last(self):
print ("Last name :",self.lname)
firstname = information("Name")
lastname = information("Test")
但是,Pylint给了我一个错误:
E1120:No value for argument 'lname' in constructor call (11,13)
E1120:No value for argument 'lname' in constructor call (12,12)
这里的问题是什么?我想我已经将lname定义为' self.lname = lname"
答案 0 :(得分:2)
__init__()
期待两个位置参数,但是给出了一个。
查看您的__init__()
:
def __init__(self,fname,lname):
您应该创建类的对象并使用此对象来调用类的函数,如下所示:
class information:
def __init__(self,fname,lname):
self.fname = fname
self.lname = lname
def first(self):
print ("First name :", self.fname)
def last(self):
print ("Last name :",self.lname)
obj = information("Name", "Test") # <-- see two arguments passed here.
firstname = obj.first()
lastname = obj.last()
# First name : Name
# Last name : Test
注意:创建类的对象时,会自动调用类的构造函数。在创建对象时传递的参数必须与构造函数中的参数数匹配。
答案 1 :(得分:0)
正如Austin评论的那样, init 期望参数lname的值。
你似乎是python的新手,所以建议你使用这样的教程来更好地理解函数参数 https://www.tutorialspoint.com/python/python_functions.htm
我会试着总结一下这个。声明函数参数有几种方法:
def f(arg1, arg2):
print(arg1)
print(arg2)
f(1, 2)
# OUT: 1
# OUT: 2
def f(arg1, arg2="default"):
print(arg1)
print(arg2)
f(1)
# OUT: 1
# OUT: default
f(1, 2)
# OUT: 1
# OUT: 2
*
。例如:
def f(arg1, *args):
print(arg1)
print(args)
f(1)
# OUT: 1
# OUT: ()
f(1, 2, 3, 4, 5)
# OUT: 1
# OUT: (2, 3, 4, 5)
**kwargs
)。就像获取所有命名参数一样,名称不是字典中的位置或默认值参数。它们标有**
。例如:
def f(arg1, **kwargs):
print(arg1)
print(kwargs)
f(1)
# OUT: 1
# OUT: {]
f(1, a=2, b=3, c=4, d=5)
# OUT: 1
# OUT: {'a':2, 'b':3, 'c': 4, 'd:' 5}
(*)参数可以按名称传递,因此您可以按照这种方式使用您喜欢的顺序。但是,如果您按名称传递参数,则必须按名称传递以下参数。