標籤:執行個體變數 情況 sel python str 總結 pytho docstring 改變
一、靜態方法(staticmethod)
- 靜態方法是通過@staticmethod 裝飾器,將普通方法裝飾為一個靜態方法。
- 靜態方法在類中不必傳入self參數,不能訪問類變數和執行個體變數。下面先寫一個靜態方法的例子:
1 class ClassName(object): 2 """docstring for ClassName""" 3 def __init__(self, arg): 4 self.arg = arg 5 6 @staticmethod 7 def foo(): 8 print(‘**************‘) 9 10 a = ClassName(8)11 a.foo()
這裡面的foo方法就被裝飾為了一個靜態方法,他不能訪問類變數和執行個體變數,可以調用。
在建立執行個體時,不會自動把執行個體本身當做參數傳給self,因此在方法中不必寫參數self,如果寫上了self,由於沒有自動把執行個體傳給它,那麼會報錯說這裡應有一個參數但是沒有傳入。這就是所說的,靜態方法不能訪問執行個體變數和類變數,如果想不報錯,要麼老老實實的不要傳self參數,就做一個獨立方法,這時,這個靜態方法和類也就沒什麼太大的聯絡的,只不過是相當於處於這個命名空間內。還有一個方法就是,他沒有自動把執行個體對象傳給self參數,那麼我們可以人為的把這個執行個體傳進去。
上面的代碼就是第一種情況,既然不能訪問執行個體變數類變數,就不傳參數,不訪問,下面是人為傳入一個對象。
1 class ClassName(object): 2 """docstring for ClassName""" 3 def __init__(self, arg): 4 self.arg = arg 5 6 @staticmethod 7 def foo(self): 8 print(‘**************‘,self.arg) 9 10 a = ClassName(8)11 a.foo(a) # 調用這個靜態方法時,由於裡面有self參數,那麼就把上面建立好的對象傳給self12 13 ClassName.foo(a) # 這句代碼錶示,靜態方法可以直接通過類名來調用,而普通方法不可以
二、類方法(classmethod)
- 通過@classmethod 裝飾的方法為類方法。
- 類方法只能訪問類變數,不能訪問執行個體變數。
- 當我們直接存取初始化後的執行個體變數時,會提示沒有這個屬性(AttributeError: type object ‘ClassName‘ has no attribute ‘arg‘)。
1 class ClassName(object): 2 """docstring for ClassName""" 3 4 name = ‘pig‘ # 這是一個類屬性 5 6 def __init__(self, arg): # init初始化的是執行個體屬性和執行個體方法,這裡唯寫了一個屬性 7 self.arg = arg 8 9 @classmethod10 def foo(cls): #類方法參數預設寫為cls11 print(‘**************‘,cls.name)12 13 a = ClassName(8)14 a.name = ‘cat‘ # 這裡我通過一個執行個體對象將name改變了,後面輸出可以看到,foo方法並沒有改變,印證了類方法無法訪問執行個體變數15 a.foo()16 17 ClassName.foo() # 同樣,類方法也可以直接通過類名來調用
三、總結
- 普通方法不能直接通過類名來調用,而靜態方法和類方法可以
- 訪問:
- 普通方法可以通過self來訪問執行個體屬性
- 類方法可以通過cls來訪問類屬性,但不能訪問執行個體屬性
- 靜態方法無法訪問執行個體變數和類變數,一定要訪問的話可以通過傳入執行個體對象的方法手動訪問執行個體變數
python--staticmethod(靜態方法)和classmethod(類方法)