【问题标题】:When using self in a function doesn't let me invoke the function [closed]在函数中使用 self 时不允许我调用该函数 [关闭]
【发布时间】:2020-07-05 11:04:35
【问题描述】:

对不起,如果这是一个愚蠢的问题,但我是初学者,在谷歌上找不到答案,所以我想在这里问学习。当我写作时

Class Buttons:
 def play_b(self):
    self.play_button = Button(main_window, text="Play")
    self.play_button.grid(row=0, column=0)

它返回TypeError: play_b() missing 1 required positional argument: 'self'

但是,当我编写以下内容时,它可以完美运行:

class Buttons:
 def play_b():
    play_button = Button(main_window, text="Play")
    play_button.grid(row=0, column=0)
   

我的问题是:为什么会这样?函数不应该总是有 self 关键字吗?

编辑:这是到目前为止的所有代码:这是迄今为止的所有代码:

from tkinter import *

main_window = Tk()
main_window.geometry("720x480")

class Buttons:
    def play_b():
        play_button = Button(main_window, text="Play")
        play_button.grid(row=0, column=0)

Buttons.play_b()

【问题讨论】:

  • 您能否确保您提供minimal reproducible example - 最短的代码,其他人可以在不进行任何更改的情况下复制和粘贴以查看完全相同的错误?现在的代码从不尝试invoke play_b,因此在调用时发生的错误永远不会有机会发生。
  • 不清楚play_button() 是什么。这是在哪里定义的?错误来自play_b(),但你没有显示你在哪里调用它。
  • 您显然是在尝试调用类本身(类似于Buttons.play_b())上的方法,而不是类的实例(这将是Buttons().play_b())。后者是类的正常使用方式。
  • ...也就是说正常的用法是buttons = Buttons(); buttons.play_b().
  • 我已经编辑了帖子并编写了我写的所有代码

标签: python


【解决方案1】:

我相信您已经搞砸了 cmets 中提到的方法调用。像这样调用方法

obj = Buttons() # assuming no parameterized __init__ (constructor) method
obj.play_b()

在第二种情况下,它是一个静态方法,即它不对对象的(自身)数据做任何事情,因此它可以工作。但更改不会反映在对象中。查看更多关于静态方法的信息here

编辑

更新问题后,我看到您直接调用了类方法,没有实例化它。因此问题。解决方案仍然与我之前提到的相同。首先创建一个对象(实例化),然后使用该对象调用方法。

【讨论】:

  • 一个方法需要 @staticmethod 装饰器是静态的。如果该方法没有碰巧使用self 也没关系,它仍然必须在调用中。没有很好的解释为什么 1 失败而 2 工作,因为它在调用方法时失败,而不是方法本身。我认为发布的示例中未显示代码中的某些内容。
  • 那当然更具可读性,但正如我链接的网站所示,这不是必须的。
  • 该链接显示 staticmethod 用作函数和装饰器。装饰器只是使用函数的语法糖。 OP 没有静态方法。像所有常规方法一样,它是一个绑定到类的函数(没有自我),但是当从类实例调用时,python 会将其转换为方法。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-08-03
  • 2015-03-13
  • 2013-02-16
  • 2014-10-05
  • 2021-08-30
  • 2013-05-23
  • 1970-01-01
相关资源
最近更新 更多