『無為則無心』Python面向對象 — 58、類方法和靜態方法
- 2022 年 2 月 28 日
- 筆記
- 高級測試技能 - Python基礎
1、實例方法
實例方法既可以調用靜態方法也可以調用類方法。
# 定義一個類
class A(object):
# 類屬性
count = 0
def __init__(self):
self.name = '孫悟空'
# 實例方法
# 在類中定義,以self為第一個參數的方法都是實例方法
# 實例方法在調用時,Python會將調用對象作為self傳入
# 實例方法可以通過實例和類去調用
# 當通過實例調用時,會自動將當前調用對象作為self傳入
# 當通過類調用時,不會自動傳遞self,此時我們必須手動傳遞self
def test(self):
print('這是test方法~~~ ' , self)
# 創建A類對象
a = A()
# 通過對象調用test方法
a.test()
# 通過類直接調用test方法
# 需要手動傳入一個對象
A.test(a)
# 所以# a.test() 等價於 A.test(a)
2、類方法
(1)類方法特點
- 在類內部使用
@classmethod
來修飾的方法屬於類方法。 - 對於類方法,第一個參數必須是類對象,一般以
cls
作為第一個參數,就是class
的簡寫。
(2)類方法使用場景
- 當方法中 需要使用類對象 (如訪問私有類屬性等)時,定義類方法。
- 類方法一般和類屬性配合使用。
# 定義一個類
class A(object):
# 類屬性
count = 0
__age = 18
def __init__(self):
self.name = '孫悟空'
# 實例方法
# 在類中定義,以self為第一個參數的方法都是實例方法
# 實例方法在調用時,Python會將調用對象作為self傳入
# 實例方法可以通過實例和類去調用
# 當通過實例調用時,會自動將當前調用對象作為self傳入
# 當通過類調用時,不會自動傳遞self,此時我們必須手動傳遞self
def test(self):
print('這是test方法~~~ ', self)
# 類方法
# 在類內部使用 @classmethod 來修飾的方法屬於類方法
# 類方法的第一個參數是cls,也會被自動傳遞,cls就是當前的類對象
# 類方法和實例方法的區別,實例方法的第一個參數是self,而類方法的第一個參數是cls
# 類方法可以通過類去調用,也可以通過實例調用,沒有區別
@classmethod
def test_2(cls):
# cls就是當前所在類的類對象
print('這是test_2方法,他是一個類方法~~~ ', cls)
# 可以通過cls直接調用類中的類屬性
print(cls.count)
return cls.__age
# 創建A類對象
a = A()
# 通過對象調用test_2方法
a.test_2()
# 通過類直接調用test_2方法
A.test_2()
# A.test_2() 等價於 a.test_2()
3、靜態方法
(1)靜態方法特點
- 在類中使用
@staticmethod
來修飾的方法屬於靜態方法,靜態方法既不需要傳遞類對象也不需要傳遞實例對象(形參沒有self/cls
),如果有需要,需要什麼參數,就填寫什麼參數就可以。 - 靜態方法 也能夠通過 實例對象 和 類對象 去訪問。
(2)靜態方法使用場景
- 當方法中 既不需要使用實例對象(如實例對象,實例屬性),也不需要使用類對象 (如類屬性、類方法、創建實例等)時,定義靜態方法。
- 取消不需要的參數傳遞,有利於 減少不必要的記憶體佔用和性能消耗。
# 定義一個類
class A(object):
# 類屬性
count = 0
def __init__(self):
self.name = '孫悟空'
# 實例方法
# 在類中定義,以self為第一個參數的方法都是實例方法
# 實例方法在調用時,Python會將調用對象作為self傳入
# 實例方法可以通過實例和類去調用
# 當通過實例調用時,會自動將當前調用對象作為self傳入
# 當通過類調用時,不會自動傳遞self,此時我們必須手動傳遞self
def test(self):
print('這是test方法~~~ ', self)
# 類方法
# 在類內部使用 @classmethod 來修飾的方法屬於類方法
# 類方法的第一個參數是cls,也會被自動傳遞,cls就是當前的類對象
# 類方法和實例方法的區別,實例方法的第一個參數是self,而類方法的第一個參數是cls
# 類方法可以通過類去調用,也可以通過實例調用,沒有區別
@classmethod
def test_2(cls):
# cls就是當前所在類的類對象
print('這是test_2方法,他是一個類方法~~~ ', cls)
# 可以通過cls直接調用類中的類屬性
print(cls.count)
# 靜態方法
# 在類中使用 @staticmethod 來修飾的方法屬於靜態方法
# 靜態方法不需要指定任何的默認參數,
# 靜態方法可以通過類和實例去調用。
# 靜態方法,基本上是一個和當前類無關的方法,它只是一個保存到當前類中的函數
# 靜態方法一般都是一些工具方法。
@staticmethod
def test_3():
print('test_3執行了~~~')
# 創建A類對象
a = A()
# 通過對象調用test_3方法
a.test_3()
# 通過類直接調用test_3方法
A.test_3()
# A.test_3() 等價於 a.test_3()
"""
靜態方法和函數的區別:
靜態方法必須要用類對象或者實例對象來調用。
函數直接使用。
"""