1. 場景
前幾天,有一個小伙伴過來問我,Python 中的 @staticmethod、@classmethod、self、cls 分別代表什么意思,自己平時光顧著用,不知道具體的含義?
事實上,由于 Python 語言的靈活性,這部分內(nèi)容在日常編碼過程中,很容易被忽略掉
本篇文章將和大家一起聊聊這幾個小知識點
2.@staticmethod
裝飾器 @staticmethod 修飾的方法稱為:靜態(tài)方法,和普通的函數(shù)沒有什么區(qū)別
下面將聊聊實際項目中幾種應(yīng)用場景
1、要調(diào)用一個靜態(tài)方法,一般使用形式是:「 類名.方法名() 」
class Web(object):
@staticmethod
def foo_staticmethod():
"""靜態(tài)方法"""
pass
if __name__ == '__main__':
# 直接使用類名+方法名調(diào)用
Web.foo_staticmethod()
當(dāng)然,也可以實例化一個類對象,通過這個對象去調(diào)用靜態(tài)方法,但是不建議使用這種方式
# 實例化一個對象
instance = Web()
# 使用實例對象去調(diào)用靜態(tài)方法(不建議)
instance.foo_staticmethod()
2、針對類中定義的靜態(tài)變量,可以使用「 類名.變量名 」 的形式去訪問
class Web(object):
# 靜態(tài)變量(類變量)
name = "Python_Web"
@staticmethod
def foo_staticmethod():
"""靜態(tài)方法"""
# 引用靜態(tài)變量
print(Web.name)
3、靜態(tài)方法內(nèi)部使用其他靜態(tài)方法、類方法,同樣是使用「 類名.方法名() 」去調(diào)用
class Web(object):
# 靜態(tài)變量(類變量)
name = "Python_Web"
# 類方法
@classmethod
def foo_classmethod_other(cls):
print('類方法被調(diào)用!')
# 另外一個靜態(tài)方法
@staticmethod
def foo_staticmethod_other():
print('另外一個靜態(tài)方法被調(diào)用!')
@staticmethod
def foo_staticmethod():
"""靜態(tài)方法"""
# 調(diào)用其他靜態(tài)方法
print(Web.foo_staticmethod_other())
# 調(diào)用類方法
print(Web.foo_classmethod_other())
4、靜態(tài)方法內(nèi)部調(diào)用普通方法,訪問實例屬性
普通方法和實例屬性都必須通過實例對象去引用,不能直接使用類名去訪問
class Web(object):
def __init__(self):
self.desc = "實例屬性,不共享"
def norm_method(self):
"""普通方法"""
print('普通方法被調(diào)用!')
@staticmethod
def foo_staticmethod():
"""靜態(tài)方法"""
instance = Web()
# 獲取實例屬性
print(instance.desc)
# 調(diào)用普通方法
instance.norm_method()
5、子類的使用
在子類中調(diào)用父類定義好的靜態(tài)方法,只需要將類名替換為子類名稱即可
class Web(object):
@staticmethod
def foo_staticmethod(arg1, arg2):
pass
class Django(Web):
"""子類"""
pass
if __name__ == '__main__':
# 1、使用類名(父類)去調(diào)用靜態(tài)方法
Web.foo_staticmethod("Hello", ",AirPython")
# 2、使用類名(子類)去調(diào)用靜態(tài)方法
Django.foo_staticmethod("Hello", ",AirPython")
3.@classmethod
裝飾器 @classmethod 修飾的方法稱為:類方法,在使用的時候,會將類本身作為第一個參數(shù) cls 傳遞給類方法
# 類方法,第一個參數(shù)為cls,代表類本身
@classmethod
def foo_classmethod(cls):
pass
其中,cls 代表外層類本身,可以實例化,也可以直接調(diào)用靜態(tài)方法、類方法、靜態(tài)變量
下面逐一進行說明
1、要調(diào)用一個類方法,一般使用形式是:「 類名.方法名() 」
class Web(object):
# 類方法,第一個參數(shù)為cls,代表類本身
@classmethod
def foo_classmethod(cls):
pass
if __name__ == '__main__':
# 使用類名去調(diào)用類方法
Web.foo_classmethod()
和靜態(tài)方法類似,也可以實例化一個類對象,通過這個對象去調(diào)用靜態(tài)方法,但是不建議使用這種方式
2、調(diào)用靜態(tài)變量
靜態(tài)方法內(nèi)部引用靜態(tài)變量有兩種方式,分別是:
- 「 類名.變量名 」
- 「 cls.變量名 」
注意:由于 cls 代表就是外層類本身,所以這兩種方式等效
class Web(object):
# 靜態(tài)變量(類變量)
name = "Python_Web"
# 類方法,第一個參數(shù)為cls,代表類本身
@classmethod
def foo_classmethod(cls):
# 調(diào)用靜態(tài)變量方式一
print(cls.name)
# 調(diào)用靜態(tài)變量方式二
print(Web.name)
3、類方法內(nèi)部調(diào)用其他類方法、靜態(tài)方法
在一個類方法內(nèi)部,可以使用「 類名.類方法名() 」、「 類名.靜態(tài)方法名() 」的形式去調(diào)用方法
class Web(object):
# 靜態(tài)方法
@staticmethod
def foo_staticmethod():
print('靜態(tài)方法被調(diào)用!')
# 其他類方法
@classmethod
def foo_classmethod_other(cls):
print('另外一個類方法被調(diào)用!')
# 類方法,第一個參數(shù)為cls,代表類本身
@classmethod
def foo_classmethod(cls):
# 調(diào)用其他類方法
cls.foo_classmethod_other()
# 調(diào)用靜態(tài)方法
cls.foo_staticmethod()
if __name__ == '__main__':
Web.foo_classmethod()
4、類方法內(nèi)部調(diào)用普通方法,訪問實例屬性
需要通過 cls 變量實例化一個類對象,然后通過這個對象去調(diào)用普通方法和實例屬性
class Web(object):
def __init__(self):
self.desc = "實例屬性,不共享"
def norm_method(self):
"""普通方法"""
print('普通方法被調(diào)用!')
# 類方法,第一個參數(shù)為cls,代表類本身
@classmethod
def foo_classmethod(cls):
# 如果要調(diào)用實例屬性,必須使用cls實例化一個對象,然后再去引用
print(cls().desc)
# 如果要調(diào)用普通方法,必須使用cls實例化一個對象,然后再去引用
cls().norm_method()
5、子類的使用
在子類中調(diào)用父類定義好的類方法,只需要將類名替換為子類名稱即可,代碼和靜態(tài)方法類似
4.區(qū)別
下面總結(jié)一下普通方法、靜態(tài)方法、類方法的區(qū)別
- 普通方法:第一個參數(shù) self 代表實例對象本身,可以使用 self 直接引用定義的實例屬性和普通方法;如果需要調(diào)用靜態(tài)方法和類方法,通過「 類名.方法名() 」調(diào)用即可
- 靜態(tài)方法:使用「 類名.靜態(tài)變量 」引用靜態(tài)變量,利用「 類名.方法名() 」調(diào)用其他靜態(tài)方法和類方法;如果需要調(diào)用普通方法,需要先實例化一個對象,然后利用對象去調(diào)用普通方法
- 類方法:第一個參數(shù) cls 代表類本身(等價),通過「 cls.靜態(tài)變量 」或「 類名.靜態(tài)變量 」引用靜態(tài)變量,利用「 cls.方法名() 」或「 類名.方法名() 」去調(diào)用靜態(tài)方法和類方法;如果需要調(diào)用普通方法,需要先實例化一個對象,然后利用對象去調(diào)用普通方法
- 靜態(tài)方法和類方法是針對類定義的,除了可以使用類名去調(diào)用,也可以使用實例對象去調(diào)用,但是不建議
5.最后
一般來說,如果方法內(nèi)部涉及到實例對象屬性的操作,建議用普通方法;如果方法內(nèi)部沒有操作實例屬性的操作,僅僅包含一些工具性的操作,建議使用靜態(tài)方法;而如果需要對類屬性,即靜態(tài)變量進行限制性操作,則建議使用類方法
-
編碼
+關(guān)注
關(guān)注
6文章
915瀏覽量
54651 -
函數(shù)
+關(guān)注
關(guān)注
3文章
4237瀏覽量
61965 -
靜態(tài)
+關(guān)注
關(guān)注
1文章
28瀏覽量
14502 -
python
+關(guān)注
關(guān)注
53文章
4753瀏覽量
84076
發(fā)布評論請先 登錄
相關(guān)推薦
評論