1. 程式人生 > >(轉)關於python3中staticmethod(靜態方法)classmethod(類方法)例項方法的聯絡和區別

(轉)關於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、例項方法也可訪問類變數,在變數名稱相同時,它存在優先選擇順序即:例項變數>類變數>父類變數