深入淺出帶你理解靜態方法和類方法的區別

class A():

    x1 = 3

    def __init__(self):
        self.num = 1

    @ staticmethod
    def test1():
        print("這裏是靜態方法輸出")
        print(A().num) # 靜態方法調用實例屬性,類屬性,類方法都需要 類名()  # 這種屬於實例一個對象調用的,靜態方法在定義上是不能調用實例屬性實例屬性,類屬性,類方法
        print(A().x1)
        # A().test2()

    @classmethod
    def test2(cls):
        print("這裏是類方法輸出")
        print(cls().num) # 類方法調用實例屬性需要cls()  # 這種屬於實例一個對象調用的,類方法在定義上是不能調用實例屬性
        print(cls.x1)  # 類方法調用類屬性和函數都只用cls.
        # cls.test1()


class B(A):
    pass



a = A()

b = B()

B.test1()# 靜態方法可以直接用類名訪問,方便調用,一般都是和類有相同功能,但是也可以脫離類獨立存在的方法,這種避免了寫硬代碼,比如一些計算功能就可以用靜態方法
b.test2()

del A #  刪除A的引用之後,運行報錯的是靜態方法,類方法依然可以運行,B調用依然是一樣的,所以在繼承上父類使用類方法程序能更穩定。

a.test2()
A.test1()

 

關於靜態方法在繼承上的一些理解:

static是靜態的。特點是在類被裝載時最先開闢內存空間,而且無論類被實例化多少次都只開闢一次內存空間。他本身與能否繼承沒有關係。

子類不能覆蓋父類的static 方法,當在子類中有一個和父類 同名 同參數類型 的方法時,調用子類的這個方法 運行的是子類的方法原因在於引用改變,而子類沒有相似方法時調用的是父類的方法,原因也同樣在於子類”繼承“了父類的這個方法(其實只是引用父類的方法),當自己“重寫”方法是隱藏了對父類靜態方法的引用。

 


 

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