知識點 - python 裝飾器@staticmethod和@classmethod區別和使用
阿新 • • 發佈:2018-02-27
定義 整潔 參數 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() @classmethoddef 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.註意我們在定義這些方法時的區別
- 類的普通方法,第一個參數需要self參數表示自身。
- @staticmethod不需要表示自身對象的self和自身類的cls參數,就跟使用函數一樣。
- @classmethod也不需要self參數,但第一個參數需要是表示自身類的cls參數。
4.方法內部
- 如果在@staticmethod中要調用到這個類的一些屬性方法,只能直接類名.屬性名或類名.方法名。
- 而@classmethod因為持有cls參數,可以來調用類的屬性,類的方法,實例化對象等,避免硬編碼。
- 如果需要調用帶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區別和使用