(轉)關於python3中staticmethod(靜態方法)classmethod(類方法)例項方法的聯絡和區別
原文:http://dmcoders.com/2017/08/30/pythonclass/
https://zhuanlan.zhihu.com/p/28010894------正確理解Python中的 @[email protected]方法
https://blog.csdn.net/jypfhx/article/details/75045471---python學習系列---staticmethod和classmethod
突然發覺自己好幾天沒寫東西了,除了晚上加班,週末還得陪兒子好好玩耍,可能不小心又會荒廢了自己的學習念頭。
這陣子研究scrapy爬蟲,涉及到了類的很多知識,其中關於類方法、靜態方法、例項方法的區別和聯絡就是很有意思的一個方面~~
我從資料探勘角度來看,python的類是資料集的特徵屬性集,而例項則是每個資料樣本!
下面就這些內容,參考了網友和自己的學習體會,重新編寫了一個案例,簡單明瞭的案例
類變數
1、屬於整個類,隱藏在類內部,對外不隨意使用
2、用於整個類的內部呼叫,非某個方法專屬
class Expclass():
cls_a = '類變數'
例項變數
1、屬於類的例項化,對外提供使用
2、被例項物件呼叫或修改
class Expclass():
def __inif__(self): self.a = '例項變數'
self和cls的概念和區別
1、self:在python中通常代表例項物件本身,作為定義例項方法的隱引數
2、cls:在python中通常代表類本身,用於定義類方法的隱引數
classmethod的概念和特點
1、定義形式:@classmethod,將一個方法定義為類方法
2、可訪問類變數,形式如cls.類變數,屬於軟編碼
3、不能訪問例項變數
staticmethod的概念和特點
1、定義形式:@staticmethod,將一個方法定義為靜態方法
2、可訪問類變數,形式如類名.類變數,屬於硬編碼
3、不能訪問例項變數
'''定義個例子'''
class Expclass():
#定義:類變數 cls_a = '類變數' #定義:例項變數 def __init__(self): self.a = '例項變數' #定義:類方法,使用隱參cls,代表類本身 @classmethod def classdef(cls,text): c = text.split('-') print('--類方法--') print(c) print(cls.cls_a) #此處軟編碼呼叫類變數:cls.類變數 print(cls.a) #此處報錯,類方法無法呼叫例項變數!! #定義:靜態方法 @staticmethod def staticdef(text): c = text.split('-') print('--靜態方法--') print(c) print(Expclass.cls_a) #此處硬編碼呼叫類變數:類名.類變數 print(self.a) #此處報錯,靜態方法無法呼叫例項變數!! #定義:例項方法,使用隱參self,代表例項本身 def objectdef(self,text): c = text.split('-') print('--例項方法--') print(c) print(self.cls_a) #此處例項呼叫類變數:self.類變數 print(self.a) #此處例項呼叫例項變數:self.例項變數
'''實際測試:方法例項化'''
demo = Expclass()
'''直接呼叫類方法'''
Expclass.classdef('測試-文字')
--類方法--
['測試', '文字']
類變數
---------------------------------------------------------------------------
AttributeError Traceback (most recent call last)
<ipython-input-6-aac421d3fac5> in <module>()
1 '''直接呼叫類方法'''
----> 2 Expclass.classdef('測試-文字')
<ipython-input-1-865ab624379a> in classdef(cls, text)
14 print(c)
15 print(cls.cls_a) #此處軟編碼呼叫類變數:cls.類變數
---> 16 print(cls.a) #此處報錯,類方法無法呼叫例項變數!!
17 #定義:靜態方法
18 @staticmethod
AttributeError: type object 'Expclass' has no attribute 'a'
'''例項化呼叫類方法'''
demo.classdef('測試-文字')
--類方法--
['測試', '文字']
類變數
---------------------------------------------------------------------------
AttributeError Traceback (most recent call last)
<ipython-input-7-c129a55a8f9f> in <module>()
1 '''例項化呼叫類方法'''
----> 2 demo.classdef('測試-文字')
<ipython-input-1-865ab624379a> in classdef(cls, text)
14 print(c)
15 print(cls.cls_a) #此處軟編碼呼叫類變數:cls.類變數
---> 16 print(cls.a) #此處報錯,類方法無法呼叫例項變數!!
17 #定義:靜態方法
18 @staticmethod
AttributeError: type object 'Expclass' has no attribute 'a'
'''直接呼叫靜態方法'''
Expclass.staticdef('測試-文字')
--靜態方法--
['測試', '文字']
類變數
---------------------------------------------------------------------------
NameError Traceback (most recent call last)
<ipython-input-9-ce18ad6012cc> in <module>()
1 '''直接呼叫靜態方法'''
----> 2 Expclass.staticdef('測試-文字')
<ipython-input-1-865ab624379a> in staticdef(text)
22 print(c)
23 print(Expclass.cls_a) #此處硬編碼呼叫類變數:類名.類變數
---> 24 print(self.a) #此處報錯,靜態方法無法呼叫例項變數!!
25 #定義:例項方法,使用隱參self,代表例項本身
26 def objectdef(self,text):
NameError: name 'self' is not defined
'''例項化呼叫靜態方法'''
demo.staticdef('測試-文字')
--靜態方法--
['測試', '文字']
類變數
---------------------------------------------------------------------------
NameError Traceback (most recent call last)
<ipython-input-10-9106ff871328> in <module>()
1 '''例項化呼叫靜態方法'''
----> 2 demo.staticdef('測試-文字')
<ipython-input-1-865ab624379a> in staticdef(text)
22 print(c)
23 print(Expclass.cls_a) #此處硬編碼呼叫類變數:類名.類變數
---> 24 print(self.a) #此處報錯,靜態方法無法呼叫例項變數!!
25 #定義:例項方法,使用隱參self,代表例項本身
26 def objectdef(self,text):
NameError: name 'self' is not defined
'''直接呼叫例項方法'''
Expclass.objectdef('測試-文字')
---------------------------------------------------------------------------
TypeError Traceback (most recent call last)
<ipython-input-11-17fb96aec4c8> in <module>()
1 '''直接呼叫例項方法'''
----> 2 Expclass.objectdef('測試-文字')
TypeError: objectdef() missing 1 required positional argument: 'text'
'''例項化呼叫例項方法'''
demo.objectdef('測試-文字')
--例項方法--
['測試', '文字']
類變數
例項變數
總結
1、類方法和靜態方法均可訪問類變數,形式不同。都不能訪問例項變數
2、例項方法也可訪問類變數,在變數名稱相同時,它存在優先選擇順序即:例項變數>類變數>父類變數