1. 程式人生 > >Python中的例項方法、classmethod和staticmethod的區別

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關鍵字訪問呼叫類屬性和類方法,

類方法: 類屬性和類方法歸所有本型別的例項物件共享, 可通過例項物件訪問, 也可通過類物件訪問. 如果要修改類屬性, 必須通過類名的方式訪問.

靜態方法:靜態方法可通過類物件或者例項物件訪問, 靜態方法內部不可訪問例項屬性, 但可通過類名訪問例項屬性.