【问题标题】:E1120:No value for argument in constructor callE1120: 构造函数调用中的参数没有值
【发布时间】:2018-06-02 12:19:56
【问题描述】:

我是 Python 类的新手,我想测试一个简单的代码:

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"

【问题讨论】:

    标签: python class oop pylint


    【解决方案1】:

    __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
    

    注意:当你创建一个类的对象时,这个类的构造函数会被自动调用。创建对象时传递的参数必须与构造函数中的参数数量匹配。

    【讨论】:

      【解决方案2】:

      正如 Austin 评论的那样,init 期望参数 lname 有一个值。

      您似乎是python新手,建议您使用这样的教程更好地理解函数参数 https://www.tutorialspoint.com/python/python_functions.htm

      我会试着总结一下。声明函数参数有多种方式:

      1. 位置(您的情况):参数是强制性的,必须按该顺序(*)进行调用。例如:
      
      
          def f(arg1, arg2):
              print(arg1)
              print(arg2) 
      
          f(1, 2)
          # OUT: 1
          # OUT: 2
      
      
      1. 默认参数。它们具有默认值,以防用户未明确设置。他们尊重顺序 (*) 并且必须始终遵循位置顺序。示例:
      
      
          def f(arg1, arg2="default"):
              print(arg1)
              print(arg2) 
      
          f(1)
          # OUT: 1
          # OUT: default
      
          f(1, 2)
          # OUT: 1
          # OUT: 2
      
      
      1. 可变长度参数 (*args)。他们继续,并将所有参数从该点获取到一个元组中。它们标有符号*。示例:
      
      
          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)。就像获取所有命名参数一样,名称不是字典中的位置或默认值参数。它们标有**。示例:
      
      
          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}
      
      

      (*) 参数可以通过名称传递,所以你可以这样使用你喜欢的顺序。但是如果你按名称传递参数,则以下参数也必须按名称传递。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-06-30
        • 1970-01-01
        • 2018-05-30
        • 1970-01-01
        • 2019-09-21
        • 2021-09-09
        • 1970-01-01
        • 2011-10-08
        相关资源
        最近更新 更多