簡體   English   中英

“缺少 self 作為方法中的第一個參數”。 為什么在這種情況下需要 self ?

[英]"Missing self as first argument in method". Why the need of self in this case?

我正在學習如何使用 PyQt5 開發一些簡單的 GUI 應用程序。 因為它,我也在學習 Python。 有一些關於類的事情我不明白。

例如,這里我有一個簡單的 GUI 代碼:

from PyQt5 import QtWidgets, QtCore
import sys

class Ui_MainWindow:
    def setupUi(self, MainWindow):
        MainWindow.setObjectName("MainWindow")
        MainWindow.setWindowTitle("Simple GUI")
        MainWindow.resize(800,600)

        self.button = QtWidgets.QPushButton(MainWindow)
        self.button.setGeometry(QtCore.QRect(10, 10, 91, 91))
        self.button.setObjectName("button1")
        self.button.setText("Button")

        self.new_dialog = QtWidgets.QDialog()

        self.button.clicked.connect(lambda: New_Dialog.setupDialog(self.new_dialog, "Simple Dialog"))

class New_Dialog:
    def setupDialog(window, window_name):
        window.setObjectName(window_name)
        window.setWindowTitle(window_name)
        window.resize(600,400)

        window.exec()

app = QtWidgets.QApplication(sys.argv)
MainWindow = QtWidgets.QMainWindow()
ui = Ui_MainWindow()
ui.setupUi(MainWindow)
MainWindow.show()
sys.exit(app.exec_())

該代碼生成一個帶有按鈕的簡單主窗口。 當我按下按鈕時,會彈出一個新的對話窗口(如圖所示)。

在此處輸入圖片說明

這是我想要的,但會產生 5 個錯誤:

  1. 方法應該有“自我”作為第一個參數

  2. “New_Dialog”的實例沒有“setObjectName”成員

  3. “New_Dialog”的實例沒有“setWindowTitle”成員

  4. “New_Dialog”的實例沒有“resize”成員

  5. “New_Dialog”的實例沒有“exec”成員

分析錯誤時,我想知道:如果方法內部沒有self.variable ,為什么我總是要在類的方法中使用self作為參數?

當我添加self作為參數時,當我按下按鈕時它會顯示以下錯誤:

self.button.clicked.connect(lambda: New_Dialog.setupDialog(self.new_dialog, "Simple Dialog"))
TypeError: setupDialog() missing 1 required positional argument: 'window_name'

我做錯了什么?

正如查爾斯·達菲 (Charles Duffy) 所提到的,無論您是否想要(或使用它),您都會獲得self 不管你叫它什么。 當您在 python 類中創建實例方法時, self是該方法的一部分——它始終是調用該方法時的第一個參數。 如果您決定在方法定義中省略self ,那么您在參數列表中列出的第一件事將是具有不同名稱的self

class foo:
  def bar(baz):
    print("self is having an identity crisis, he thinks his name is baz")

在這個例子中, baz是與self相同的對象。 self這個詞的用法並不特殊,只是習慣上我們都稱它為同一個東西。 但無論名稱如何,它始終是您在參數列表中列出的第一件事。

默認情況下,所有方法都是實例方法,除非另有明確聲明。 如果您真的不想要self並且永遠不會使用它,請將方法聲明為@staticmethod

@staticmethod
def my_method():
  # can't use self here...

靜態方法總是有點問題:如果它不與定義它的類的狀態交互,它真的屬於該類的一部分嗎? 還是應該將其移至同一模塊內的獨立功能?

現在,如果你這樣做:

New_Dialog.setupDialog(new_dialog, "Simple Dialog")

in 實際上是在類本身上調用setupDialog方法,而不是在類的實例(一個對象)上。 在這種情況下,Python 沒有self可以自動傳遞,因為還沒有創建對象實例。 很多時候,這樣稱呼它是錯誤的,而真正的意圖是:

New_Dialog().setupDialog(new_dialog, "Simple Dialog")

這里有一些很好的解釋: Python 中“self”這個詞的目的是什么?

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM