1. 程式人生 > 其它 >關於python中類的相關說明,類名直接呼叫方法會報錯

關於python中類的相關說明,類名直接呼叫方法會報錯

今天在寫指令碼的時候,發現在對類直接呼叫方法這種寫法,一直提示傳參錯誤,然後百度後發現這個解釋應該是最合理的,為什麼類名直接呼叫方法會報錯

通過前面的學習,類方法大體分為 3 類,分別是類方法、例項方法和靜態方法,其中例項方法用的是最多的。我們知道,例項方法的呼叫方式其實有 2 種,既可以採用類物件呼叫,也可以直接通過類名呼叫。

通常情況下,我們習慣使用類物件呼叫類中的例項方法。但如果想用類呼叫例項方法,不能像如下這樣:

執行上面程式碼,程式會報出如下錯誤:

Traceback (most recent call last):
File "D:\python3.6\demo.py", line 5, in <module>
CLanguage.info()
TypeError: info() missing 1 required positional argument: 'self'

其中,最後一行報錯資訊提示我們,呼叫 info() 類方式時缺少給 self 引數傳參。這意味著,和使用類物件呼叫例項方法不同,通過類名直接呼叫例項方法時,Python 並不會自動給 self 引數傳值。

讀者想想也應該明白,self 引數需要的是方法的實際呼叫者(是類物件),而這裡只提供了類名,當然無法自動傳值。

因此,如果想通過類名直接呼叫例項方法,就必須手動為 self 引數傳值。例如修改上面的程式碼為

再次執行程式,結果為:

我正在學 Python

可以看到,通過手動將 clang 這個類物件傳給了 self 引數,使得程式得以正確執行。實際上,這裡呼叫例項方法的形式完全是等價於clang.info()。



值得一提的是,上面的報錯資訊只是讓我們手動為 self 引數傳值,但並沒有規定必須傳一個該類的物件,其實完全可以任意傳入一個引數,例如:

執行結果為:

zhangsan 正在學 Python

可以看到,"zhangsan" 這個字串傳給了 info() 方法的 self 引數。顯然,無論是 info() 方法中使用 self 引數呼叫其它類方法,還是使用 self 引數定義新的例項變數,胡亂的給 self 引數傳參都將會導致程式執行崩潰。

總的來說,Python 中允許使用類名直接呼叫例項方法,但必須手動為該方法的第一個 self 引數傳遞引數,這種呼叫方法的方式被稱為“非繫結方法”。

用類的例項物件訪問類成員的方式稱為繫結方法,而用類名呼叫類成員的方式稱為非繫結方法。