E1120:构造函数调用中的参数没有值

时间:2018-06-02 12:19:57

标签: python class oop pylint

我对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"

2 个答案:

答案 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

我会试着总结一下这个。声明函数参数有几种方法:

  1. 位置(您的情况):参数是必需的,必须按顺序(*)进行控制。例如:
  2. 
    
        def f(arg1, arg2):
            print(arg1)
            print(arg2) 
    
        f(1, 2)
        # OUT: 1
        # OUT: 2
    
    
    1. 默认参数。如果未由用户明确设置,则它们具有默认值。他们尊重秩序(*),必须始终在位置之后。例如:
    2. 
      
          def f(arg1, arg2="default"):
              print(arg1)
              print(arg2) 
      
          f(1)
          # OUT: 1
          # OUT: default
      
          f(1, 2)
          # OUT: 1
          # OUT: 2
      
      
      1. 可变长度参数(* args)。他们追求,并从那一点获得所有参数到元组。它们标有符号*。例如:
      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)
        
        
        1. 关键字参数(**kwargs)。就像获取所有命名参数一样,名称不是字典中的位置或默认值参数。它们标有**。例如:
        2. 
          
              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}
          
          

          (*)参数可以按名称传递,因此您可以按照这种方式使用您喜欢的顺序。但是,如果您按名称传递参数,则必须按名称传递以下参数。