您好,登錄后才能下訂單哦!
一般來說,要使用某個類的方法,需要先實例化一個對象再調用方法。
而使用@staticmethod或@classmethod,就可以不需要實例化,直接類名.方法名()來調用。
這有利于組織代碼,把某些應該屬于某個類的函數給放到那個類里去,同時有利于命名空間的整潔。
既然@staticmethod和@classmethod都可以直接類名.方法名()來調用,那他們有什么區別呢
從它們的使用上來看
如果在@staticmethod中要調用到這個類的一些屬性方法,只能直接類名.屬性名或類名.方法名。
而@classmethod因為持有cls參數,可以來調用類的屬性,類的方法,實例化對象等,避免硬編碼。
要明白,什么是實例方法、靜態方法和類方法:
class Demo(object): def instance_method(self, your_para): """ this is an instance_method you should call it like the follow: a = Demo() a.instance_method(your_para) plus: in python, we denote 'cls' as latent para of Class while 'self' as latent para of the instance of the Class :param your_para: :return: """ print("call instance_method and get:", your_para) @classmethod def class_method(cls, your_para): """ this is a class_method you can call it like the follow: method1: a = Demo() a.class_method(your_para) method2: Demo.class_method plus: in python, we denote 'cls' as latent para of Class while 'self' as latent para of the instance of the Class :param your_para: :return: """ print("call class_method and get:", your_para) @staticmethod def static_method(your_para): """ this is a static_method and you can call it like the methods of class_method :param your_para: :return: """ print("call static_method and get:", your_para)
雖然類方法在調用的時候沒有顯式聲明cls,但實際上類本身是作為隱含參數傳入的。這就像實例方法在調用的時候也沒有顯式聲明self,但實際上實例本身是作為隱含參數傳入的。
對于靜態函數,我們一般把與類無關也與實例無關的函數定義為靜態函數。例如入口檢查的函數就最好定義成靜態函數。
類方法的妙處, 在繼承中的作用:
class Fruit(object): total = 0 # 這是一個類屬性 @classmethod def print_total(cls): print('this is the ', cls, '.total:', cls.total, ' and its id: ', id(cls.total)) # cls是類本身,打印類屬性total的值 print('this is the Fruit.total:', Fruit.total, 'and its id: ', id(Fruit.total)) print("=======================") @classmethod def set(cls, value): cls.total = value class Apple(Fruit): pass class Orange(Fruit): pass app1 = Apple() app1.set(10) app1.print_total() Apple.print_total() Fruit.set(2) app1.print_total() Fruit.print_total() """ output: this is the <class '__main__.Apple'> .total: 10 and its id: 1355201264 this is the Fruit.total: 0 and its id: 1355200944 ======================= this is the <class '__main__.Apple'> .total: 10 and its id: 1355201264 this is the Fruit.total: 0 and its id: 1355200944 ======================= this is the <class '__main__.Apple'> .total: 10 and its id: 1355201264 this is the Fruit.total: 2 and its id: 1355201008 ======================= this is the <class '__main__.Fruit'> .total: 2 and its id: 1355201008 this is the Fruit.total: 2 and its id: 1355201008 ======================= """
總結
以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作具有一定的參考學習價值,謝謝大家對億速云的支持。如果你想了解更多相關內容請查看下面相關鏈接
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。