python類名和類方法cls修改類變量的值
- 通過類對象是無法修改類變量的值的,本質(zhì)其實(shí)是給類對象新添加 name 和 age 這 2 個(gè)實(shí)例變量。不會影響類的其它實(shí)例化對象,更不會影響同名的類變量。
- 和類變量不同,實(shí)例變量只能通過類對象名訪問,無法通過類名訪問。
- 通過cls和類名修改類變量的值,會修改同名的類變量,會影響所有的實(shí)例化對象
class Person: ? ? name='jerry' ? ? age='20' ? ? def __init__(self, name, age): ? ? ? ? self.name = name ? ? ? ? self.age = age ? ? ? ? print("構(gòu)造函數(shù)", name, age) ? ? @classmethod ? ? def A(cls): ? ? ? ? # cls()等價(jià)于類Person(), ? ? ? ? # 通過類對象p是無法修改類變量的 ? ? ? ? p=cls("Tom", 18) ? ? ? ? print('cls:', cls, p) ? ? ? ? return p ? ? ? @classmethod ? ? def B(cls): ? ? ? ? # 類方法cls可以直接調(diào)用類變量 ? ? ? ? print("B結(jié)果:", cls.name, cls.age) ? ? ? @classmethod ? ? def C(cls): ? ? ? ? # 類方法cls可以直接調(diào)用類變量 ? ? ? ? # cls和類名一樣可修改類變量的值,會影響所有的實(shí)例化對象 ? ? ? ? cls.name="曹操" ? ? ? ? cls.age=50 if __name__ == '__main__': ? ? ? Person.B() ? ? Person.C() ? ? print("C方法修改后,類變量的值:", Person.name, Person.age) ? ? # 可以使用類名直接調(diào)用類方法 ? ? person = Person.A() ? ? print(person.name, person.age) ? ? print("最終類變量的值:", Person.name, Person.age)
?D:\MC\venv\Scripts\python.exe D:/MC/test01.py
B結(jié)果:
jerry 20
C方法修改后,類變量的值: 曹操 50
構(gòu)造函數(shù) Tom 18
cls: <class '__main__.Person'> <__main__.Person object at 0x000002362F849D00> Tom 18
最終類變量的值:
曹操 50
Process finished with exit code 0
我對Man這個(gè)類進(jìn)行實(shí)例化2次,每個(gè)實(shí)例的id都不一樣。這就依靠類方法來實(shí)現(xiàn)了:首先,用@classmethod描述類方法,然后用"cls"代表本類。類方法對類屬性進(jìn)行的處理是有記憶性的。
需要注意的是:類方法處理的變量一定要是類變量。因?yàn)樵陬惙椒ɡ锬阌貌涣藄elf來尋址實(shí)例變量,所以需要把類變量放到最前面描述,如上面的"id=0"所示。類變量是可以被self訪問的,所以,在類變量定義好了以后,不需要在_init_函數(shù)里對類變量再一次描述。所以,上面代碼里self.id不一定需要。
對于需要改變類變量的值的同學(xué)(每次調(diào)用id_number(cls)方法,類變量id的值會改變),可以有效利用這個(gè)技巧,來進(jìn)行模型的加載。比如,把模型封裝成一個(gè)類,把初始化網(wǎng)絡(luò)和加載模型用類方法來描述,這樣每一次load之后,可以一直實(shí)用模型。
class Man: ? ? id = 0 ?# 類變量 ? ? def __init__(self, name): ? ? ? ? self.name = name ? ? ? ? self.id = self.id_number() ? ? @classmethod ? ? def id_number(cls): ? ? ? ? # 類方法可以改變類屬性,對類屬性進(jìn)行的處理是有記憶性的。 ? ? ? ? # 類方法處理的變量一定要是類變量。因?yàn)樵陬惙椒ɡ锬阌貌涣藄elf來尋址實(shí)例變量, ? ? ? ? # 所以需要把類變量放到最前面描述,如上面的"id=0"所示。 ? ? ? ? cls.id += 1 ? ? ? ? cls.ww=2 ? ? ? ? return cls.id, cls.ww ? ?a = Man('A') print(a.id) b = Man('B') print(b.id) c=Man.id_number() print(c)
D:\MC\venv\Scripts\python.exe D:/MC/test2.py (1, 2) (2, 2) (3, 2) ?Process finished with exit code 0
到此這篇關(guān)于python類名和類方法cls修改類變量的值的文章就介紹到這了,更多相關(guān)python修改類變量值內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Python實(shí)現(xiàn)讀取郵箱中的郵件功能示例【含文本及附件】
這篇文章主要介紹了Python實(shí)現(xiàn)讀取郵箱中的郵件功能,可讀取郵件文本及附件的功能,涉及Python針對郵件的獲取、分析、保存等相關(guān)操作技巧,需要的朋友可以參考下2017-08-08安裝python3.7編譯器后如何正確安裝opnecv的方法詳解
這篇文章主要介紹了安裝python3.7編譯器后如何正確安裝opnecv,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-06-06pyqt5 實(shí)現(xiàn)在別的窗口彈出進(jìn)度條
今天小編就為大家分享一篇pyqt5 實(shí)現(xiàn)在別的窗口彈出進(jìn)度條,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧2019-06-06python Matplotlib數(shù)據(jù)可視化(1):簡單入門
這篇文章主要介紹了python Matplotlib的相關(guān)資料,幫助大家入門matplotlib,繪制各種圖表,感興趣的朋友可以了解下2020-09-09django+xadmin+djcelery實(shí)現(xiàn)后臺管理定時(shí)任務(wù)
這篇文章主要介紹了django+xadmin+djcelery實(shí)現(xiàn)后臺管理定時(shí)任務(wù),小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2018-08-08pycharm 中mark directory as exclude的用法詳解
今天小編就為大家分享一篇pycharm 中mark directory as exclude的用法詳解,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-02-02Python基礎(chǔ)學(xué)習(xí)之條件控制語句小結(jié)
如果我需要設(shè)置一個(gè)死循環(huán),然后靠條件來終止,怎么辦?一個(gè)很簡單的問題,但是我卻沒有說,這一篇本應(yīng)該在分支控制語句里面的,現(xiàn)在只能拿出來水文再寫一篇了,需要的朋友可以參考下2021-05-05