• <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++博客 :: 首頁(yè) :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理

            Python的staticmethod和classmethod

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

            下面的代碼,簡(jiǎn)單試驗(yàn)了兩者的區(qū)別,并通過staticmethod簡(jiǎn)單的模擬了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精品国产自在现线小黄鸭 | AA级片免费看视频久久| 国内精品久久久久久久亚洲| 久久综合亚洲色HEZYO国产| 久久久久免费精品国产| 99久久超碰中文字幕伊人| 精品人妻伦一二三区久久| 色婷婷综合久久久久中文一区二区| 日本福利片国产午夜久久| 少妇高潮惨叫久久久久久| 久久久久无码专区亚洲av| 久久精品水蜜桃av综合天堂| 久久久久久久综合综合狠狠| 久久精品国产福利国产秒| 国产毛片欧美毛片久久久| 久久艹国产| 国产精品岛国久久久久| 日产精品久久久久久久| 人人狠狠综合88综合久久| 国产精品久久99| 日韩人妻无码一区二区三区久久| 亚洲人成无码网站久久99热国产 | 久久精品中文字幕有码| 精品久久久久久亚洲| 亚洲中文字幕无码久久精品1 | 亚洲午夜久久久影院伊人| 久久e热在这里只有国产中文精品99| 久久久无码精品亚洲日韩蜜臀浪潮| 热综合一本伊人久久精品| 久久福利片| 久久人人超碰精品CAOPOREN| 国产国产成人久久精品| 女人香蕉久久**毛片精品| 久久综合丝袜日本网| 99久久国产热无码精品免费久久久久| 一本色道久久88精品综合 | 久久久亚洲欧洲日产国码二区| 蜜臀久久99精品久久久久久| 国产毛片久久久久久国产毛片| 91精品免费久久久久久久久|