python中類方法、實例方法、靜態方法

懷着萬分的羞恥和悲憤之情寫下這篇博客。下午考了一套筆試,編程題怎麼也通不過,代碼邏輯應該是沒有問題的,由於不允許使用本地IDE沒報錯信息一直沒發現問題所在。

剛剛把代碼再寫了一遍,我做題時候用的是python,雖然我對python其實不是很熟悉……但畢竟python寫代碼還是寫得比Java又簡潔又快啊。
把我的代碼簡化,整個思路就如下

class getMin():
    def fun(self, arr, n):
        print(arr[n-1])

if __name__ == "__main__":
    arr = input().strip().split(" ")
    n = int(input())
    getMin.fun(arr, n)

兩個問題:
1、從鍵盤獲取到的arr是字符串,即便我split了,每一個元素仍然是字符串,而不是數值。
2、我這裏用了類去調用實例方法,我在本地pycharm上這樣子寫時,會報錯:

Parameter 'n' unfilled..

其大意是fun方法需要一個叫n的參數,但是我沒有傳過去。
很是費解,明明傳了呀。

後來想到fun應該是實例方法吧,不能直接用類調用?

正解了。

python類中實例方法(第一個參數爲self)的一般只能用實例去調用,類其實也可以調用,但是類需要再傳遞一個實例,既然你都實例出來了,就沒必要再類調用了吧==

而python中的類方法會有一個@classmethod的函數修飾符,第一個參數會是cls,類方法可以被類和實例調用。當然了,類方法可以訪問類屬性不能訪問實例屬性。

順便,python中還有一個靜態方法,與類方法類似,有@staticmethod的修飾符,可以訪問類屬性不能訪問實例屬性,與類方法不同的是,靜態方法可以被類和實例調用。
原代碼如下:

class getMin():
    # 實例方法
    def fun(self, arr, n):
        print(arr[n-1])
    # 類方法
    @classmethod
    def class_fun(cls):
        print("this is class function")

if __name__ == "__main__":
    arr = input().strip().split(" ")
    int_arr = []
    for item in arr:
        int_arr.append(int(item))
    n = int(input())

    instance = getMin()
    # 用實例調用實例方法
    instance.fun(int_arr, n)
    # 用類調用方法
    getMin.fun(instance, int_arr, n)
    # 實例調用類方法
    instance.class_fun()
    # 類調用類方法
    getMin.class_fun()

總結
例子:

class getMin():
    class_pro = "class_pro"

    def __init__(self, pro):
        self.instance_pro = pro

    def instance_fun(self):
        print(getMinNum.class_pro)
        print(self.instance_pro)

    @classmethod
    def class_fun(cls):
        print(getMinNum.class_pro)
        # print(getMinNum.instance_pro) 報錯

    @staticmethod
    def static_fun():
        print(getMinNum.class_pro)
        # print(getMinNum.instance_pro) 報錯

if __name__ == "__main__":
    instance = getMinNum("pro")
    instance.instance_fun()
    getMinNum.instance_fun(instance)
    print("---------------")
    instance.class_fun()
    getMinNum.class_fun()
    print("---------------")
    instance.static_fun()
    getMinNum.static_fun()

流下不學無術的眼淚。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章