天天看點

Python中的執行個體方法、classmethod和staticmethod的差別

class NewsPaper(object):

    # 類屬性
    __print_times = 0 # 下劃線表示私有屬性

    # 執行個體方法
    def __init__(self, title, content):
        self.title = title  # 執行個體屬性
        self.content = content  # 執行個體屬性
        # 累加類屬性變量
        NewsPaper.__print_times += 1

    # 執行個體方法
    def show_news(self):
        print("報紙标題:%s" % self.title)
        print("報紙内容:%s" % self.content)

    # 類方法(封裝類屬性,外界提供通路接口,保護類屬性)
    @classmethod
    def get_times(cls):
        return cls.__print_times

    # 靜态方法
    @staticmethod
    def static_method():
        # 靜态方法(可通過類名通路類屬性)
        # 靜态方法不可通路執行個體屬性
        print(NewsPaper.__print_times)
        print("我是靜态方法!")
           

1. 執行個體屬性和執行個體方法

在類中使用__init__初始化的屬性叫做叫做執行個體屬性

使用def定義的函數叫做執行個體方法

2. 類屬性和類方法

在建立類class下面直接定義的變量稱作類屬性

使用@classmethod裝飾器進行裝飾的函數,稱作類方法 

# 類方法(封裝類屬性,外界提供通路接口,保護類屬性)
    @classmethod
    def get_times(cls):
        return cls.__print_times
           

3. 靜态方法

使用@staticmethod裝飾器進行裝飾的函數,稱作靜态方法

靜态方法沒有預設的 self 或者 cls 參數, 如果方法并沒有通路執行個體屬性或者類屬性, 我們可将其設定為靜态方法, 減少了參數的傳遞.

# 靜态方法
    @staticmethod
    def static_method():
        # 靜态方法(可通過類名通路類屬性)
        # 靜态方法不可通路執行個體屬性
        print(NewsPaper.__print_times)
        print("我是靜态方法!")
           

 三者的差別

執行個體方法:執行個體方法可以通過執行個體對象進行調用和通路, 方法内可以使用self通路調用執行個體屬性和執行個體方法,使用cls關鍵字通路調用類屬性和類方法,

類方法: 類屬性和類方法歸所有本類型的執行個體對象共享, 可通過執行個體對象通路, 也可通過類對象通路. 如果要修改類屬性, 必須通過類名的方式通路.

靜态方法:靜态方法可通過類對象或者執行個體對象通路, 靜态方法内部不可通路執行個體屬性, 但可通過類名通路執行個體屬性.