『無為則無心』Python物件導向 — 58、類方法和靜態方法

繁華似錦Fighting發表於2022-02-28

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


"""
靜態方法和函式的區別:
靜態方法必須要用類物件或者例項物件來呼叫。
函式直接使用。
"""

相關文章