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