在线观看不卡亚洲电影_亚洲妓女99综合网_91青青青亚洲娱乐在线观看_日韩无码高清综合久久

鍍金池/ 教程/ Python/ 類方法和靜態(tài)方法
基礎(chǔ)
itertools
HTTP 服務(wù)
hashlib
閉包
文件和目錄
單元測(cè)試
使用 @property
標(biāo)準(zhǔn)模塊
陌生的 metaclass
Base64
進(jìn)程、線程和協(xié)程
讀寫二進(jìn)制文件
匿名函數(shù)
輸入和輸出
Click
元組
字符編碼
partial 函數(shù)
參考資料
collections
協(xié)程
類和實(shí)例
Python 之旅
定制類和魔法方法
常用數(shù)據(jù)類型
繼承和多態(tài)
ThreadLocal
HTTP 協(xié)議簡(jiǎn)介
Requests 庫的使用
讀寫文本文件
列表
os 模塊
迭代器 (Iterator)
正則表達(dá)式
集合
上下文管理器
異常處理
你不知道的 super
定義函數(shù)
datetime
資源推薦
字典
slots 魔法
hmac
第三方模塊
進(jìn)程
類方法和靜態(tài)方法
函數(shù)參數(shù)
高階函數(shù)
函數(shù)
re 模塊
高級(jí)特性
線程
argparse
生成器
結(jié)束語
字符串
map/reduce/filter
函數(shù)式編程
Celery
裝飾器

類方法和靜態(tài)方法

在講類方法和靜態(tài)方法之前,先來看一個(gè)簡(jiǎn)單的例子:

class A(object):
    def foo(self):
        print 'Hello ', self

>>> a = A()
>>> a.foo()
Hello,  <__main__.A object at 0x10c37a450>

在上面,我們定義了一個(gè)類 A,它有一個(gè)方法 foo,然后我們創(chuàng)建了一個(gè)對(duì)象 a,并調(diào)用方法 foo。

類方法

如果我們想通過類來調(diào)用方法,而不是通過實(shí)例,那應(yīng)該怎么辦呢?

Python 提供了 classmethod 裝飾器讓我們實(shí)現(xiàn)上述功能,看下面的例子:

class A(object):
    bar = 1
    @classmethod
    def class_foo(cls):
        print 'Hello, ', cls
        print cls.bar

>>> A.class_foo()   # 直接通過類來調(diào)用方法
Hello,  <class '__main__.A'>
1

在上面,我們使用了 classmethod 裝飾方法 class_foo,它就變成了一個(gè)類方法,class_foo 的參數(shù)是 cls,代表類本身,當(dāng)我們使用 A.class_foo() 時(shí),cls 就會(huì)接收 A 作為參數(shù)。另外,被 classmethod 裝飾的方法由于持有 cls 參數(shù),因此我們可以在方法里面調(diào)用類的屬性、方法,比如 cls.bar。

靜態(tài)方法

在類中往往有一些方法跟類有關(guān)系,但是又不會(huì)改變類和實(shí)例狀態(tài)的方法,這種方法是靜態(tài)方法,我們使用 staticmethod 來裝飾,比如下面的例子:

class A(object):
    bar = 1
    @staticmethod
    def static_foo():
        print 'Hello, ', A.bar

>>> a = A()
>>> a.static_foo()
Hello, 1
>>> A.static_foo()
Hello, 1

可以看到,靜態(tài)方法沒有 self 和 cls 參數(shù),可以把它看成是一個(gè)普通的函數(shù),我們當(dāng)然可以把它寫到類外面,但這是不推薦的,因?yàn)檫@不利于代碼的組織和命名空間的整潔。

小結(jié)

  • 類方法使用 @classmethod 裝飾器,可以使用類(也可使用實(shí)例)來調(diào)用方法。
  • 靜態(tài)方法使用 @staticmethod 裝飾器,它是跟類有關(guān)系但在運(yùn)行時(shí)又不需要實(shí)例和類參與的方法,可以使用類和實(shí)例來調(diào)用。
上一篇:協(xié)程下一篇:itertools