小編寫這篇文章的主要目的,是講述一下關于Python的一些小技巧,包括類方法與靜態方法之間,存在一些什么區別呢?怎么從真正的意義上去理解關于其不同之間的區別呢?下面就給大家詳細的解答下。
前言
在python的類中不僅可以有methods,還可以有變量,這些變量稱為類屬性,例如如下代碼中Book類的TYPES即為類屬性。
類中的方法分為3類:
1.實例方法instance method
不使用裝飾器
類中的所有方法,如果第一個參數是self,就是instance method,self是創建的類實例,實例方法與實例即對象相關。
(self可以改成別的名稱,但使用self是convention,self是類實例,),
2.類方法class method
使用classmethod裝飾
類方法的第一個參數總是cls。如果方法需要類的信息,用classmethod對其進行裝飾,類方法經常被用作factory,例如如下代碼中的hardcover和paperback兩個class method方法就是可用于創建對象的factory。
(cls可以改成別的名稱,但使用cls是convention)
3.靜態方法static method
使用staticmethod裝飾
靜態方法并不是真正意義上的類方法,它只是一個被放到類里的函數而已。
盡管如此,仍然稱之為方法,但它沒有關于class或object的任何信息,所以它實際上是一個獨立的函數,只是被放到了類里,靜態方法既沒有self也沒有cls參數。(靜態方法可以訪問類屬性,例如Book.TYPES)
靜態方法通常用于組織代碼,例如如果認為將某個函數放到某個類里,整體代碼會因此更符合邏輯,于是可以將這個函數變成該類的靜態方法。所以如果需要在類里放一個函數進去,此函數不會用到任何關于類或實例的信息,那么就可以用staticmethod對其進行裝飾。
三種方法中,實例方法和類方法用得最多,靜態方法不常用。
class Book: TYPES=("hardcover","paperback")#精裝,平裝 def __init__(self,name,book_type,weight): self.name=name self.book_type=book_type self.weight=weight def __repr__(self): return f"<Book{self.name},{self.book_type},weighing{self.weight}g>" def instance_method(self): print(f"Called instance method of{self}") classmethod def class_method(cls): print(f"called class method of{cls}") classmethod def hardcover(cls,name,paper_weight):#cls名稱任意,使用cls是convention #下一行的cls,改成Book,代碼也能跑,但應該寫成cls,以避免在inheritance可能會遇到的問題 return cls(name,cls.TYPES[0],paper_weight+100)# classmethod def paperback(cls,name,paper_weight): #下一行的cls,改成Book,代碼也能跑,但應該寫成cls,以避免在inheritance可能會遇到的問題 return cls(name,cls.TYPES[1],paper_weight) staticmethod def static_method(): print("Called static method") book=Book("Dive into Python",Book.TYPES[1],800) #Called instance method of<Book Dive into Python,paperback,weighing 800g> book.instance_method() #下一行代碼和上一行完全等價 #Called instance method of<Book Dive into Python,paperback,weighing 800g> Book.instance_method(book) #called class method of<class'__main__.Book'> Book.class_method() #Called static method Book.static_method() h_book=Book.hardcover("Harry Potter",1500) light=Book.paperback("Python 101",600) #<Book Harry Potter,hardcover,weighing 1600g> print(h_book) #<Book Python 101,paperback,weighing 600g> print(light)
綜上所述,關于Python中類方法與靜態方法之間的區別,就為大家介紹到這里了,希望可以給大家帶來更多的幫助。
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/128020.html
摘要:前言最近在看設計模式。類抽象類中接口圖示接口在中的圖形為可以看到再其上半部分有一個的表示。代碼在中本事是沒有接口和抽象類這一概念的,但是可以通過這個庫來實現。在代碼中的結構就是繼承非抽象類。箭頭指向抽象類。 前言 最近在看設計模式。在學習初期一直有一個問題困擾著我,那就是UML類圖 中的各種結構用python代碼是如何實現的?這個在初期可以說是深深的困擾著我的設計模式 學習之路。下...
摘要:里,有兩種方法獲得一定范圍內的數字返回一個列表,還有返回一個迭代器。在引用計數的基礎上,還可以通過標記清除解決容器對象可能產生的循環引用的問題。列舉常見的內置函數的作用,過濾函數,循環函數累積函數一行代碼實現乘法表。 showImg(https://segmentfault.com/img/remote/1460000019294205); 1、為什么學習Python? 人生苦短?人間...
摘要:不像其他屬性,描述符在類級別上創建。當所有者類被定義時,每個描述符對象都是被綁定到一個不同的類級別屬性的描述符類實例。這必須返回描述符的值。此外,描述符對有一個方便的響應和請求格式。 注:原書作者 Steven F. Lott,原書名為 Mastering Object-oriented Python __getattribute__()方法 __getattribute__()方法是...
摘要:本文的分享主要圍繞以下幾個方面能做什么常見應用場景介紹如何學習語法基礎實戰面向對象編程實戰練熟基礎小游戲項目的實現與實戰一能做什么一種編程語言往往可以應用于多方面,有些方面比較常用,有些方面極為常用。比如表示是一個空列表。 摘要:Python語言的教程雖然隨處可見,但是忙于日常業務/學習的你或許:一直想要找個時間學一點,但是又不知道該從何下手?本文將從Python能做什么,如何學習Py...
摘要:面向對象類是現實世界或思維世界的實體在計算機中的反映它將數據以及這些數據上的操作封裝在一起屬性特征方法函數行為構造函數初始化類的特征構造函數是自動被調用的,也可顯式調用,但不能定義值,只能返回一般不用作用初始化類的特征值,讓對象之間變 面向對象: #類是現實世界或思維世界的實體在計算機中的反映 #它將數據以及這些數據上的操作封裝在一起 # 屬性-特征 # 方法(函數)-行...
閱讀 911·2023-01-14 11:38
閱讀 878·2023-01-14 11:04
閱讀 740·2023-01-14 10:48
閱讀 1983·2023-01-14 10:34
閱讀 942·2023-01-14 10:24
閱讀 819·2023-01-14 10:18
閱讀 499·2023-01-14 10:09
閱讀 572·2023-01-14 10:02