網站首頁 編程語言 正文
1.實例方法
Python 的實例方法用得最多,也最常見。我們先來看 Python 的實例方法。
class Kls(object): def __init__(self, data): self.data = data def printd(self): print(self.data) ik1 = Kls('leo') ik2 = Kls('lee') ik1.printd() ik2.printd()
輸出:
leo
lee
上述例子中,printd 為一個實例方法。實例方法第一個參數為self,當使用ik1.printd()調用實例方法時,實例ik1會傳遞給self參數,這樣self參數就可以引用當前正在調用實例方法的實例。利用實例方法的這個特性,上述代碼正確輸出了兩個實例的成員數據。
2.類方法
Python 的類方法采用裝飾器 @classmethod 來定義,我們直接看例子。
class Kls(object): num_inst = 0 def __init__(self): Kls.num_inst = Kls.num_inst + 1 @classmethod def get_no_of_instance(cls): return cls.num_inst ik1 = Kls() ik2 = Kls() print (ik1.get_no_of_instance()) print (Kls.get_no_of_instance())
輸出
2
2
在上述例子中,我們需要統計類Kls實例的個數,因此定義了一個類變量num_inst來存放實例個數。通過裝飾器 @classmethod 的使用,方法 get_no_of_instance
被定義成一個類方法。
在調用類方法時,Python 會將類(class Kls)傳遞給cls,這樣在get_no_of_instance
內部就可以引用類變量num_inst。
由于在調用類方法時,只需要將類型本身傳遞給類方法,因此,既可以通過類也可以通過實例來調用類方法。
注意,實例方法只可以通過實例來調用。
3.靜態方法
在開發中,我們常常需要定義一些方法,這些方法跟類有關,但在實現時并不需要引用類或者實例,例如,設置環境變量,修改另一個類的變量,等。這個時候,我們可以使用靜態方法。
Python 使用裝飾器 @staticmethod 來定義一個靜態方法。
IND = 'ON' class Kls(object): def __init__(self, data): self.data = data @staticmethod def checkind(): return IND == 'ON' def do_reset(self): if self.checkind(): print('Reset done for: %s' % self.data) def set_db(self): if self.checkind(): print('DB connection made for: %s' % self.data) ik1 = Kls(24) ik1.do_reset() ik1.set_db()
輸出:
Reset done for: 24
DB connection made for: 24
在代碼中,我們定義了一個全局變量IND,由于IND跟類Kls相關,所以我們將方法checkind放置在類Kls中定義。方法checkind只需檢查IND的值,而不需要引用類或者實例,因此,我們將方法checkind定義為靜態方法。
對于靜態方法,Python 并不需要傳遞類或者實例,因此,既可以使用類也可以使用實例來調用靜態方法。
4.實例方法與類方法和靜態方法的區別
我們用代碼說明實例方法,類方法,靜態方法的區別。注意下述代碼中方法foo,class_foo,static_foo的定義以及使用。
''' 學習中遇到問題沒人解答?小編創建了一個Python學習交流群:711312441 尋找有志同道合的小伙伴,互幫互助,群里還有不錯的視頻學習教程和PDF電子書! ''' class Kls(object): def foo(self, x): print('executing foo(%s,%s)' % (self, x)) @classmethod def class_foo(cls,x): print('executing class_foo(%s,%s)' % (cls,x)) @staticmethod def static_foo(x): print('executing static_foo(%s)' % x) ik = Kls() # 實例方法 ik.foo(1) print(ik.foo) print('==========================================') # 類方法 ik.class_foo(1) Kls.class_foo(1) print(ik.class_foo) print('==========================================') # 靜態方法 ik.static_foo(1) Kls.static_foo('hi') print(ik.static_foo)
輸出:
executing foo(<__main__.Kls object at 0x0551E190>,1)
<bound method Kls.foo of <__main__.Kls object at 0x0551E190>>
==========================================
executing class_foo(<class '__main__.Kls'>,1)
executing class_foo(<class '__main__.Kls'>,1)
<bound method type.class_foo of <class '__main__.Kls'>>
==========================================
executing static_foo(1)
executing static_foo(hi)
<function static_foo at 0x055238B0>
對于實例方法,調用時會把實例ik作為第一個參數傳遞給self參數。因此,調用ik.foo(1)時輸出了實例ik的地址。
對于類方法,調用時會把類Kls作為第一個參數傳遞給cls參數。因此,調用ik.class_foo(1)時輸出了Kls類型信息。
前面提到,可以通過類也可以通過實例來調用類方法,在上述代碼中,我們再一次進行了驗證。
對于靜態方法,調用時并不需要傳遞類或者實例。其實,靜態方法很像我們在類外定義的函數,只不過靜態方法可以通過類或者實例來調用而已。
值得注意的是,在上述例子中,foo只是個函數,但當調用ik.foo的時候我們得到的是一個已經跟實例ik綁定的函數。調用foo時需要兩個參數,但調用ik.foo時只需要一個參數。foo跟ik進行了綁定,因此,當我們打印ik.foo時,會看到以下輸出:
<bound method Kls.foo of <__main__.Kls object at 0x0551E190>>
當調用ik.class_foo時,由于class_foo是類方法,因此,class_foo跟Kls進行了綁定(而不是跟ik綁定)。當我們打印ik.class_foo時,輸出:
<bound method type.class_foo of <class '__main__.Kls'>>
當調用ik.static_foo時,靜態方法并不會與類或者實例綁定,因此,打印ik.static_foo(或者Kls.static_foo)時輸出:
<function static_foo at 0x055238B0>
概括來說,是否與類或者實例進行綁定,這就是實例方法,類方法,靜態方法的區別。
原文鏈接:https://blog.csdn.net/qdPython/article/details/127125178
相關推薦
- 2022-07-14 使用react-activation實現keepAlive支持返回傳參_React
- 2022-09-01 ASP.NET?Core通用主機實現托管服務_實用技巧
- 2022-08-11 C#中using關鍵字的使用方法示例_C#教程
- 2022-03-03 實現不需要手動浮空瀏覽器緩存,程序可以獲取最新版本
- 2022-03-19 c語言執行Hello?World背后經歷的步驟_C 語言
- 2022-05-11 如果解決tomcat端口號被占用
- 2022-04-16 pycharm全局修改方式_python
- 2022-04-14 Python之OptionParser模塊使用詳解_python
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支