【问题标题】:TypeError: Missing 1 required positional argument: 'Caption'类型错误:缺少 1 个必需的位置参数:“标题”
【发布时间】:2018-12-18 15:55:41
【问题描述】:

所以我有 2 个 .py 文件:

  1. FW_Engine.py

  2. test.py

在 FW_Engine.py 中,我有以下代码:

import pygame

pygame.init()

class Display:

  def __init__(self, window, button):
      self.window = window
      self.button = button

  def Window(self, WindowWidth, WindowHeight, Caption):
      GameDisplay = pygame.display.set_mode((WindowWidth, WindowHeight))
      pygame.display.set_caption(Caption)


  def Button(self, DisplayWindow, Position_X, Position_Y):
      GreyColor = (96, 96, 96)
      pygame.draw.rect(DisplayWindow, GreyColor, (Position_X, Position_Y, 100, 20))

在 test.py 上,我有这段代码:

from FW_Engine import Display
import pygame

pygame.init()

GameDisplay = Display.Window(800, 600, "TestTitle")

我一直收到这个错误:

TypeError: Window() missing 1 required positional argument: 'Caption'

但正如您所见,我在函数调用中提供了所有 3 个必需的参数。有什么问题?

编辑:两个 .py 文件都在同一个目录中。

【问题讨论】:

    标签: python python-3.x class


    【解决方案1】:

    问题是您尝试调用Display.Window,就好像它是一个静态方法(即不需要实例),但事实并非如此。由于它需要一个实例,因此缺少一个参数(您提供的 3 个参数向左移动,即self800 等)因此没有提供Caption,正如错误提示的那样。

    你有两个选择:

    1. Display 实例调用Window

      Display(window, button).Window(800, 600, "TestTitle")
      

      另一种不太可取的方法是将Display 实例传递给 Display.Window:

      display = Display(window, button)
      Display.Window(display, 800, 600, "TestTitle") 
      
    2. 由于Display.Window 根本没有引用self,它可以是一个静态方法,那么您的其余代码将按原样工作:

      class Display:
          def __init__(self, window, button):
              self.window = window
              self.button = button
      
         @staticmethod
         def Window(WindowWidth, WindowHeight, Caption):
             GameDisplay = pygame.display.set_mode((WindowWidth, WindowHeight))
             pygame.display.set_caption(Caption)
      

    【讨论】:

    • 对我来说,第二种方式似乎更具可读性。他们之间有什么优缺点吗?
    • @KitsuneMakoto 不。第一个实际上是第二个的语法糖。顺便说一句,请参阅显示如何正确使用 staticmethod 的更新答案。
    • 将标记为已接受的答案,静态方法示例解决了我的问题并帮助我理解。 :)
    【解决方案2】:

    你的Window方法不是静态方法,它是一个实例方法,所以你不能在不实例化Display对象的情况下调用它。

    Window 方法的第一个参数是 self,它应该引用您创建的对象,在这种情况下它是 Display 对象。

    但实际上你并没有实例化它,所以当你调用 Window 方法时,你缺少 self 参数,这就是你看到 TypeError 的原因。

    尝试如下使用,创建Display对象后调用Window方法。

    GameDisplay = Display(window, button).Window(800, 600, "TestTitle")
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-01-11
      • 1970-01-01
      • 2018-09-12
      • 2021-08-05
      • 2021-07-06
      • 2021-08-05
      • 2017-07-23
      相关资源
      最近更新 更多