Python 中的 classmethod 和 staticmethod

來源:互聯網
上載者:User

標籤:第一個   done   com   python解譯器   main   def   alt   怎麼   idt   

類中最常用的方法是執行個體方法, 即通過通過執行個體作為第一個參數的方法。

舉個例子,一個基本的執行個體方法就向下面這個:

 class Kls(object):    def __init__(self, data):        self.data = data    def printd(self):        print(self.data)ik1 = Kls(‘arun‘)ik2 = Kls(‘seema‘)ik1.printd()ik2.printd()

這會給出如下的輸出:
arun
seema

然後看一下代碼和樣本圖片:
  • 1,2參數傳遞給方法.
  • 3 self參數指向當前執行個體自身.
  • 4 我們不需要傳遞執行個體自身給方法,Python解譯器自己會做這些操作的.

如果現在我們想寫一些僅僅與類互動而不是和執行個體互動的方法會怎麼樣呢?
可以使用@classmethod裝飾器來建立類方法.

 class Kls(object):    no_inst = 0    def __init__(self):        Kls.no_inst = Kls.no_inst + 1    @classmethod    def get_no_of_instance(cls_obj):        return cls_obj.no_instik1 = Kls()ik2 = Kls()print ik1.get_no_of_instance()print Kls.get_no_of_instance()

輸出:
2
2
這樣的好處是: 不管這個方式是從執行個體調用還是從類調用,它都用第一個參數把類傳遞過來.
@staticmethod
經常有一些跟類有關係的功能但在運行時又不需要執行個體和類參與的情況下需要用到靜態方法. 比如更改環境變數或者修改其他類的屬性等能用到靜態方法. 這種情況可以直接用函數解決, 但這樣同樣會擴散類內部的代碼,造成維護困難.
比如這樣:

 IND = ‘ON‘def checkind():    return (IND == ‘ON‘)class Kls(object):     def __init__(self,data):        self.data = datadef do_reset(self):    if checkind():        print(‘Reset done for:‘, self.data)def set_db(self):    if checkind():        self.db = ‘new db connection‘        print(‘DB connection made for:‘,self.data)ik1 = Kls(12)ik1.do_reset()ik1.set_db()

輸出:
Reset done for: 12
DB connection made for: 12
如果使用@staticmethod就能把相關的代碼放到對應的位置了 .
 IND = ‘ON‘class Kls(object):    def __init__(self, data):        self.data = data    @staticmethod    def checkind():        return (IND == ‘ON‘)    def do_reset(self):        if self.checkind():            print(‘Reset done for:‘, self.data)    def set_db(self):        if self.checkind():            self.db = ‘New db connection‘        print(‘DB connection made for: ‘, self.data)ik1 = Kls(12)ik1.do_reset()ik1.set_db()

輸出:
Reset done for: 12
DB connection made for: 12
下面這個更全面的代碼和圖示來展示這兩種方法的不同
@staticmethod 和 @classmethod的不同

 class Kls(object):    def __init__(self, data):        self.data = data    def printd(self):        print(self.data)    @staticmethod    def smethod(*arg):        print(‘Static:‘, arg)    @classmethod    def cmethod(*arg):        print(‘Class:‘, arg) >>> ik = Kls(23)>>> ik.printd()23>>> ik.smethod()Static: ()>>> ik.cmethod()Class: (<class ‘__main__.Kls‘>,)>>> Kls.printd()TypeError: unbound method printd() must be called with Kls instance as first argument (got nothing instead)>>> Kls.smethod()Static: ()>>> Kls.cmethod()Class: (<class ‘__main__.Kls‘>,)

下面這個圖解釋了以上代碼是怎麼啟動並執行:

Python 中的 classmethod 和 staticmethod

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.