1. 程式人生 > >知識點 - python 裝飾器@staticmethod和@classmethod區別和使用

知識點 - python 裝飾器@staticmethod和@classmethod區別和使用

定義 整潔 參數 sel spa elf pri Go assm

1.通常來說,我們使用一個類的方法時,首先要實例化這個類,再用實例化的類來調用其方法

class Test(object):
    """docstring for Test"""
    def __init__(self, arg=None):
        super(Test, self).__init__()
        self.arg = arg

    def say_hi(self):
        print(hello wrold)

def main():
    test = Test() #//1. 首先實例化test類
    test.say_hi() #
//2. 再調用類的方法 if __name__ == __main__: main()

輸出

hello wrold

2.而使用@staticmethod或@classmethod,就可以不需要實例化,直接類名.方法名()來調用。

這有利於組織代碼,把某些應該屬於某個類的函數給放到那個類裏去,同時有利於命名空間的整潔。

class Test(object):
    name = stephen

    """docstring for Test"""
    def __init__(self, arg=None):
        super(Test, self).
__init__() self.arg = arg def say_hi(self): print([1]hello wrold) @staticmethod def say_bad(): print([2]say bad) print([3]Test.name:%s%Test.name) #//不需要實例化 Test().say_hi() #//先要實例化,才能調用say_hi() @classmethod
def say_good(cls): print([4]say good) print([5]cls.name:%s%cls.name) #//不需要實例化 cls.say_bad() #//不需要實例化 cls().say_hi() #//先要實例化,才能調用say_hi() def main(): Test.say_bad() print("----------------------------------") Test.say_good() if __name__ == __main__: main()

輸出結果

[2]say bad
[3]Test.name:stephen
[1]hello wrold
----------------------------------
[4]say good
[5]cls.name:stephen
[2]say bad
[3]Test.name:stephen
[1]hello wrold
[1]hello wrold

3.註意我們在定義這些方法時的區別

  1. 類的普通方法,第一個參數需要self參數表示自身。
  2. @staticmethod不需要表示自身對象的self和自身類的cls參數,就跟使用函數一樣。
  3. @classmethod也不需要self參數,但第一個參數需要是表示自身類的cls參數。

4.方法內部

  1. 如果在@staticmethod中要調用到這個類的一些屬性方法,只能直接類名.屬性名或類名.方法名。
  2. 而@classmethod因為持有cls參數,可以來調用類的屬性,類的方法,實例化對象等,避免硬編碼。
  3. 如果需要調用帶self的方法,必須得先對類進行實例化。
class Test(object):
    name = stephen

    """docstring for Test"""
    def __init__(self, arg=None):
        super(Test, self).__init__()
        self.arg = arg

    def say_hi(self):
        print([1]hello wrold)

    @staticmethod
    def say_bad():
        print([2]say bad)
        print([3]Test.name:%s%Test.name) #  //不需要實例化
        Test().say_hi()                    #  //先要實例化,才能調用say_hi()

    @classmethod
    def say_good(cls):
        print([4]say good)
        print([5]cls.name:%s%cls.name)   #  //不需要實例化
        cls.say_bad()                      #  //不需要實例化
        cls().say_hi()                     #  //先要實例化,才能調用say_hi()

def main():
    Test.say_bad()
    print("----------------------------------")
    Test.say_good()

if __name__ == __main__:
    main()

輸出結果

[2]say bad
[3]Test.name:stephen
[1]hello wrold
----------------------------------
[4]say good
[5]cls.name:stephen
[2]say bad
[3]Test.name:stephen
[1]hello wrold
[1]hello wrold

知識點 - python 裝飾器@staticmethod和@classmethod區別和使用