【问题标题】:__init__() missing 1 required positional argument__init__() 缺少 1 个必需的位置参数
【发布时间】:2013-11-12 12:48:00
【问题描述】:

我正在努力学习 Python。这是一个非常简单的代码。我在这里要做的就是调用一个类的构造函数。在那里初始化一些变量并打印该变量。但这给了我一个错误。意思是:

缺少 1 个必需的位置参数

这是我的代码:

class DHT:
    def __init__(self, data):
        self.data['one'] = '1'
        self.data['two'] = '2'
        self.data['three'] = '3'
    def showData(self):
        print(self.data)

if __name__ == '__main__': DHT().showData()

【问题讨论】:

    标签: python python-3.x constructor


    【解决方案1】:

    您收到此错误是因为您没有将 data 变量传递给 DHT 构造函数。

    aIKid 和 Alexander 的答案很好,但它不会起作用,因为您仍然必须像这样在类构造函数中初始化 self.data

    class DHT:
       def __init__(self, data=None):
          if data is None:
             data = {}
          else:
             self.data = data
          self.data['one'] = '1'
          self.data['two'] = '2'
          self.data['three'] = '3'
       def showData(self):
          print(self.data)
    

    然后像这样调用方法showData:

    DHT().showData()
    

    或者像这样:

    DHT({'six':6,'seven':'7'}).showData()
    

    或者像这样:

    # Build the class first
    dht = DHT({'six':6,'seven':'7'})
    # The call whatever method you want (In our case only 1 method available)
    dht.showData()
    

    【讨论】:

    • 请注意,此解决方案存在以下潜在问题:d1 = DHT(); d2 = DHT(); d1.data['four'] = '4'; d2.showData() 显示条目为 4。换句话说,未指定 data 的后续构造函数调用将获得相同的字典。为了解决这个问题,您经常会在def 行上看到data=None,然后是检查data 是否为None 的过程的第一条语句,如果是,则将其替换为新字典。跨度>
    • 这样调用构造函数有什么问题?
    【解决方案2】:

    您可能应该将data 设为关键字参数,默认值为空字典:

    class DHT:
        def __init__(self, data=dict()):
            self.data['one'] = '1'
            self.data['two'] = '2'
            self.data['three'] = '3'
        def showData(self):
            print(self.data)
    
    if __name__ == '__main__': 
        DHT().showData()
    

    【讨论】:

      【解决方案3】:

      您的构造函数需要一个参数(数据)。您没有在通话中传递它。我猜你想初始化对象中的一个字段。看起来像这样:

      class DHT:
          def __init__(self):
              self.data = {}
              self.data['one'] = '1'
              self.data['two'] = '2'
              self.data['three'] = '3'
          def showData(self):
              print(self.data)
      
      if __name__ == '__main__':
          DHT().showData()
      

      甚至只是:

      class DHT:
          def __init__(self):
              self.data = {'one': '1', 'two': '2', 'three': '3'}
          def showData(self):
              print(self.data)
      

      【讨论】:

      • 非常感谢。这是工作。很抱歉问了这么愚蠢的问题。
      【解决方案4】:

      您需要向其中传递一些数据。例如,一个空字典。

      if __name__ == '__main__': DHT('a').showData()
      

      但是,在您的示例中,甚至不需要参数。您可以通过以下方式声明它:

      def __init__(self):
      

      也许您的意思是从数据中设置它?

      class DHT:
          def __init__(self, data):
              self.data['one'] = data['one']
              self.data['two'] = data['two']
              self.data['three'] = data['three']
          def showData(self):
              print(self.data)
      
      if __name__ == '__main__': DHT({'one':2, 'two':4, 'three':5}).showData()
      

      showData 将打印您刚刚输入的数据。

      【讨论】:

      • 非常感谢。这是工作。很抱歉问了这么愚蠢的问题。
      • 完全没问题!如果人们能从我这里学到一些东西,我已经是一只快乐的兔子了。
      【解决方案5】:

      问题出在你

      def __init__(self, data):
      

      当你从 DHT 类创建对象时,你应该传递参数 数据应该是dict类型,比如

      data={'one':1,'two':2,'three':3}
      dhtObj=DHT(data)
      

      但是在你的代码中你应该改变的是

      data={'one':1,'two':2,'three':3}
      if __name__ == '__main__': DHT(data).showData()
      

      或者

      if __name__ == '__main__': DHT({'one':1,'two':2,'three':3}).showData()
      

      【讨论】:

        【解决方案6】:

        如果错误是这样的 Author=models.ForeignKey(User, related_names='blog_posts') TypeError:init() 缺少 1 个必需的位置参数:'on_delete'

        然后解决方案将是,您必须添加一个参数 Author=models.ForeignKey(User, related_names='blog_posts', on_delete=models.DO_NOTHING)

        【讨论】:

          猜你喜欢
          • 2019-06-25
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2017-01-06
          • 2021-06-05
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多