『無為則無心』Python面向對象 — 58、類方法和靜態方法

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()


"""
靜態方法和函數的區別:
靜態方法必須要用類對象或者實例對象來調用。
函數直接使用。
"""