Python的類成員函數、靜態函數和成員的函數的比較


原創Erick_Lv 最後發佈於2019-03-17 20:06:11 閱讀數 1104  收藏
展開
從聲明方式來看:
普通成員函數是最一般的方法,即

class Foo:
    def plain_func():
        pass
1
2
3
類成員函數是

class Foo:
    @classmethod
    def class_func():
        pass
1
2
3
4
靜態函數是

class Foo:
    @staticmethod
    def static_func():
        pass
1
2
3
4
從調用方式來看,普通函數與後兩者區別較大,普通函數只能在類的實例中被調用,而後兩者可以通過類名進行調用:

class Foo:
    def plain_func(self):
        print("plain_func")

    @classmethod
    def class_func(cls):
        print("class_func")

    @staticmethod
    def static_func():
        print("static_func")


# 必須實例化進行調用
foo = Foo()
foo.plain_func()
# 通過類名進行調用
Foo.class_func()
Foo.static_func()
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
而後類方法和靜態的方法最核心的區別就在於類方法有cls參數,而靜態方法沒有cls參數。cls可以理解爲this指針,它引用了一個類實例。

來自知乎這個回答關於類方法的總結:

方法可以判斷出自己是通過基類被調用,還是通過某個子類被調用
通過子類調用時,方法可以返回子類的實例而非基類的實例
通過子類調用時,方法可以調用子類的其他classmethod
一般來說classmethod可以完全替代staticmethod。staticmethod唯一的好處是調用時它返回的是一個真正的函數,而且每次調用時返回同一個實例(classmethod則會對基類和子類返回不同的bound method實例),但這點幾乎從來沒有什麼時候是有用的。不過,staticmethod可以在子類上被重寫爲classmethod,反之亦然,因此也沒有必要提前將staticmethod全部改爲classmethod,按需要使用即可。
————————————————
版權聲明:本文爲CSDN博主「Erick_Lv」的原創文章,遵循 CC 4.0 BY-SA 版權協議,轉載請附上原文出處鏈接及本聲明。
原文鏈接:https://blog.csdn.net/qq_35976351/article/details/88625427

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章