• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            posts - 26, comments - 2, trackbacks - 0, articles - 0
              C++博客 :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理

            Python的staticmethod和classmethod

            Posted on 2014-04-16 12:01 小夜 閱讀(416) 評論(0)  編輯 收藏 引用 所屬分類: [52] Python
            最近專職做起了Python,得積累些Python的知識。
            -----------------
            閱讀代碼的時候,看到了classmethod。staticmethod用的挺多,classmethod一直沒用過,感覺有些迷惑。
            Google了一篇文章,講的挺清楚:pyhton靜態方法和類方法。上面這篇文章主要講原理,我這里主要說說二者的相同和區別。
            1. 都可以通過類調用;
            2. 都可以通過對象調用;
            3. 都可以繼承和復寫;
            4. 都可以使用類屬性、類方法和類的靜態方法;
            5. 使用這些屬性或方法時,staticmethod必須直接通過類名進行調用,classmethod可以優雅的通過參數cls調用。
            在進行屬性或方法調用時:staticmethod需要硬編碼指明方法的類,如果存在繼承,無法使用子類復寫的方法和屬性,比較適合用于對其他方法和屬性不依賴或依賴較少的情況;classmethod通過cls進行調用,這個cls是調用時傳入的類,可以是父類,也可以是子類,適合用于對其他方法和屬性依賴較多的情況,也適用于需要通過集成擴展的情況。

            下面的代碼,簡單試驗了兩者的區別,并通過staticmethod簡單的模擬了classmethod的操作:

            class Base(object):
                name = "Base"
                
                @classmethod
                def foo(cls):
                    print cls.name
                
                @staticmethod
                def foo_static1():
                    print Base.name
                
                @staticmethod
                def foo_static2(cls):
                    print cls.name

                @staticmethod
                def foo_static3(cls):
                    # if not isinstance(cls, type):
                    if isinstance(cls, Base):
                        cls = cls.__class__
                    print cls.name


            class A(Base):
                name = "A"
                def __init__(self):
                    self.name = "I am '%s'" % A.name
                    

            class B(Base):
                name = "B"
                def __init__(self):
                    self.name = "I am '%s'" % B.name
                
                @classmethod
                def foo(cls):
                    print "<%s>" % cls.name
                
                @staticmethod
                def foo_static1():
                    print "<%s>" % Base.name


            def testA():
                obj = A()
                obj.foo()
                obj.foo_static1()
                obj.foo_static2(A)
                obj.foo_static2(obj)
                obj.foo_static3(A)
                obj.foo_static3(obj)
                A.foo()
                A.foo_static1()

            def testB():
                obj = B()
                obj.foo()
                obj.foo_static1()


            def run_test(func, *args, **kwargs):
                print "======================="
                func(*args, **kwargs)
                print ""


            if __name__ == '__main__':
                run_test(testA)
                run_test(testB)
                
            思思久久99热只有频精品66| 青青草原综合久久大伊人导航| 精品国产日韩久久亚洲| 欧美日韩精品久久久免费观看| 一本色道久久HEZYO无码| 成人久久综合网| 久久婷婷色香五月综合激情| 亚洲AV无码久久寂寞少妇| 日韩欧美亚洲综合久久影院d3| 亚洲国产成人精品女人久久久 | 久久91精品国产91久久小草| yellow中文字幕久久网 | 蜜臀久久99精品久久久久久小说 | 亚洲色欲久久久久综合网| 无码久久精品国产亚洲Av影片| 99精品久久久久久久婷婷| 精品多毛少妇人妻AV免费久久| 久久精品国产免费| 麻豆亚洲AV永久无码精品久久| 欧美一级久久久久久久大片| 热99re久久国超精品首页| 成人久久免费网站| 国产精品99久久久精品无码| 国产精品青草久久久久福利99| 久久男人Av资源网站无码软件| 亚洲精品国产自在久久| 久久久久99精品成人片三人毛片 | 色成年激情久久综合| 国产产无码乱码精品久久鸭| 色综合久久久久综合体桃花网| 久久久久无码中| 香蕉99久久国产综合精品宅男自 | 久久国产成人亚洲精品影院| 大伊人青草狠狠久久| av国内精品久久久久影院| 久久精品亚洲中文字幕无码麻豆| 久久99精品久久久大学生| 97精品国产97久久久久久免费| 久久精品国产日本波多野结衣| 久久伊人精品一区二区三区| 国产精品99久久久久久宅男小说|