电脑知识|欧美黑人一区二区三区|软件|欧美黑人一级爽快片淫片高清|系统|欧美黑人狂野猛交老妇|数据库|服务器|编程开发|网络运营|知识问答|技术教程文章 - 好吧啦网

您的位置:首頁技術文章
文章詳情頁

深入了解Python 方法之類方法 & 靜態方法

瀏覽:140日期:2022-07-13 16:50:26

寫在之前

這幾天的閱讀量蜜汁低,是什么原因我也沒搞清楚,如果你們覺得我哪里寫的有問題,或者是哪里不好,歡迎后臺或者微信告知我,先行謝過。

昨天的文章 詳解類方法之綁定方法與非綁定方法 中寫了方法中的綁定方法和非綁定方法,今天我們繼續來學習剩下的「類方法」和「靜態方法」。

類方法 & 靜態方法

在開始之前,先讓我們來看下面一段代碼:

class Sample: language = 'C++' def __init__(self): self.language = 'python'def get_class_attr(cls): return cls.languageif __name__ == '__main__': print('sample.language:',Sample.language) r = get_class_attr(Sample) print('get class attribute:',r) f = Sample() print('instance attribute:',f.language)

上述代碼在類 Sample 中,定義了一個屬性 language = “C++”,這個是「類屬性」;在初始化方法中,又定義了 self.language = “python”,這個是「實例屬性」。

知道了這個,我們然后來分析一下函數 get_class_attr(cls),在這個函數中參數用的是 cls,從函數體來看,要求它引用的對象應該具有屬性 language,這說明,不是隨隨便便哪個對象都可以。很巧的是在前面定義的類 Sample 中就有 language 這個屬性,于是在調用這個函數的時候,就直接將該類對象作為方法 get_class_attr() 的參數。

Sample.language 是要得到類屬性的值,get_class_attr(Sample) 所返回的就是類 Sample 的屬性 Sample.language 的值,所以對于上述例子來說,前面兩個 print() 函數打印的結果應該是一樣的。

f = Sample() 則是創建了一個實例,然后通過 f.language 訪問實例屬性。所以對于上述的代碼的運行結果如下所示:

sample.language:C++get class attribute:C++instance attribute:python

不知道經過我上述的解釋你是否明白了,如果沒明白,建議你再仔細對比一下上述的運行結果和分析的過程。

在上述的例子中,比較特殊的函數應該是 get_class_attr(cls),它是寫在類的外面的,然而這個函數又只能調用前面寫的那個類對象,因為不是所有對象都有那個特別的 language 屬性,這種函數寫在外面不利于后期的維護,我們應該避免這種情況的發生,而避免的方法就是把函數和類寫在一起,所以就有了下面這種寫法:

class sample: language = 'C++' def __init__(self): self.language = 'python' @classmethod def get_class_attr(cls): return cls.languageif __name__ == '__main__': print('sample.language:',sample.language) r = sample.get_class_attr() print('get class attribute:',r) f = sample() print('instance attribute:',f.language) print('instance get_class_str:',f.get_class_attr())

在上面這個修改的代碼中,出現了 @classmethod,這是一個裝飾器,我們在函數的那部分講到過。這里需要我們注意的是,@classmethod 所裝飾的方法的參數中,第一個參數不是 self,這個和我們常規認識中的類的方法有所區別。這里使用了參數 cls,這是習慣的寫法,當然用其它的也可以。讓我們來看一下運行的結果:

sample.language:C++get class attribute:C++instance attribute:pythoninstance get_class_str:C++

通過上面的運行結果我們可以看到,不管是通過類還是實例來執行 get_class_attr() 得到的結果都是類屬性的值,這說明裝飾器 @classmethod 所裝飾的方法,它的參數 cls 引用的對象是類對象 Sample。

至此,「類方法」 的定義就出來了:類方法,就是在類里面定義的方法。該方法由裝飾器 @classmethod 裝飾,其第一個參數 cls 引用的是這個類對象,即將類本身作為作為引用對象傳到這個方法里。

知道了類方法以后,我們可以用同樣的思路理解另一個方法 「靜態方法」,我們還是先來看一段代碼:

import randomdef judge(n): num = random.randint(1,100) return num - n > 0class Sample: def __init__(self,name): self.name = name def get_name(self,age): if judge(age): return self.name else: return 'the name is stupid'if __name__ == '__main__': s = Sample(’rocky’) name = s.get_name(23) print(name)

先看一下上面的代碼,類 Sample 里面使用了外面的函數 judge(n),這種類和函數的關系也是因為相互關聯,所以后期的程序維護可能會出問題,于是為了便于維護,我們同樣對程序進行了修改:

import randomclass Sample: def __init__(self,name): self.name = name def get_name(self,age): if self.judge(age): return self.name else: return 'the name is stupid' @staticmethod def judge(n): num = random.randint(1,100) return num - n > 0if __name__ == '__main__': s = Sample(’rocky’) name = s.get_name(23) print(name)

同樣是經過修改優化,將原來在類外面的函數放到了類里面。但是這不是簡單的移動,還要在函數的前面加上 @staticmethod 裝飾器,并且要注意的是,雖然這個函數在類的里面,但是跟別的方法是不一樣的,它的第一個參數也不是 self,當我們要使用它的時候,可以通過實例調用,比如 self.judge(n),也可以通過類調用這個方法,比如 sample.select(n)。

從上面的程序可以看出,盡管 judge(n) 位于類里面,但它確實一個獨立的方法,與類本身沒有關系,僅僅是為了免除前面所說的后期維護上的麻煩。但是它也有存在的道理,上面的例子就是一個典型的說明。

所以「靜態方法」的定義也就出來了:在類的作用域里面,前面必須要加上一個 @staticmethod 裝飾器,我們將這種方法命名為靜態方法。

寫在之后

方法是類的重要組成部分,本章所講的類方法和靜態方法讓我們在使用類的時候有了更加便利的工具。

「方法」的這一塊到這里就補充完了,之后我們將繼續學習 OOP 的剩下兩個特征:「多態」和「封裝」,敬請期待。

如果你覺得本篇文章讓你有所收獲,歡迎點贊轉發,你的支持是對我碼字最大的動力,分享永遠在路上,我們一起加油。

The end。

以上就是深入了解Python 方法之類方法 & 靜態方法的詳細內容,更多關于python 類方法和靜態方法的資料請關注好吧啦網其它相關文章!

標簽: Python 編程
相關文章:
主站蜘蛛池模板: 扬尘在线监测系统_工地噪声扬尘检测仪_扬尘监测系统_贝塔射线扬尘监测设备「风途物联网科技」 | 立式矫直机_卧式矫直机-无锡金矫机械制造有限公司 | 烟台金蝶财务软件,烟台网站建设,烟台网络推广 | 选矿设备-新型重选设备-金属矿尾矿重选-青州冠诚重工机械有限公司 | VOC检测仪-甲醛检测仪-气体报警器-气体检测仪厂家-深恒安科技有限公司 | 杭州月嫂技术培训服务公司-催乳师培训中心报名费用-产后康复师培训机构-杭州优贝姆健康管理有限公司 | 芜湖厨房设备_芜湖商用厨具_芜湖厨具设备-芜湖鑫环厨具有限公司 控显科技 - 工控一体机、工业显示器、工业平板电脑源头厂家 | 高压直流电源_特种变压器_变压器铁芯-希恩变压器定制厂家 | 工业硝酸钠,硝酸钠厂家-淄博「文海工贸」| 吊篮式|移动式冷热冲击试验箱-二槽冷热冲击试验箱-广东科宝 | 恒温恒湿试验箱厂家-高低温试验箱维修价格_东莞环仪仪器_东莞环仪仪器 | 水性漆|墙面漆|木器家具漆|水漆涂料_晨阳水漆官网 | hdpe土工膜-防渗膜-复合土工膜-长丝土工布价格-厂家直销「恒阳新材料」-山东恒阳新材料有限公司 ETFE膜结构_PTFE膜结构_空间钢结构_膜结构_张拉膜_浙江萬豪空间结构集团有限公司 | 宝元数控系统|对刀仪厂家|东莞机器人控制系统|东莞安川伺服-【鑫天驰智能科技】 | 天长市晶耀仪表有限公司 | 浙江美尔凯特智能厨卫股份有限公司| 手机存放柜,超市储物柜,电子储物柜,自动寄存柜,行李寄存柜,自动存包柜,条码存包柜-上海天琪实业有限公司 | 恒湿机_除湿加湿一体机_恒湿净化消毒一体机厂家-杭州英腾电器有限公司 | 干式磁选机_湿式磁选机_粉体除铁器-潍坊国铭矿山设备有限公司 | 离子色谱自动进样器-青岛艾力析实验科技有限公司 | 骨密度仪-骨密度测定仪-超声骨密度仪-骨龄测定仪-天津开发区圣鸿医疗器械有限公司 | Maneurop/美优乐压缩机,活塞压缩机,型号规格,技术参数,尺寸图片,价格经销商 | 电动球阀_不锈钢电动球阀_电动三通球阀_电动调节球阀_上海湖泉阀门有限公司 | 磁力抛光机_磁力研磨机_磁力去毛刺机-冠古设备厂家|维修|租赁【官网】 | 学校用栓剂模,玻璃瓶轧盖钳,小型安瓿熔封机,实验室安瓿熔封机-长沙中亚制药设备有限公司 | 361°官方网站| 派克防爆伺服电机品牌|国产防爆伺服电机|高低温伺服电机|杭州摩森机电科技有限公司 | 山东氧化铁红,山东铁红-淄博科瑞化工有限公司 | 萃取箱-萃取槽-PVC萃取箱厂家-混合澄清槽- 杭州南方化工设备 | 船用泵,船用离心泵,船用喷射泵,泰州隆华船舶设备有限公司 | 黄石妇科医院_黄石东方女子医院_黄石东方妇产医院怎么样 | 航空障碍灯_高中低光强航空障碍灯_民航许可认证航空警示灯厂家-东莞市天翔航天科技有限公司 | 钢绞线万能材料试验机-全自动恒应力两用机-混凝土恒应力压力试验机-北京科达京威科技发展有限公司 | 玻璃钢板-玻璃钢防腐瓦-玻璃钢材料-广东壹诺 | 自清洗过滤器_全自动过滤器_全自动反冲洗过滤器_量子过滤器-滑漮滴 | 洁净棚-洁净工作棚-无菌室-净化工程公司_北京卫护科技有限公司 | 食品无尘净化车间,食品罐装净化车间,净化车间配套风淋室-青岛旭恒洁净技术有限公司 | 直读光谱仪,光谱分析仪,手持式光谱仪,碳硫分析仪,创想仪器官网 | 布袋除尘器-单机除尘器-脉冲除尘器-泊头市兴天环保设备有限公司 布袋除尘器|除尘器设备|除尘布袋|除尘设备_诺和环保设备 | 德国GMN轴承,GMN角接触球轴承,GMN单向轴承,GMN油封,GMN非接触式密封 | 上海深蓝_缠绕机_缠膜机-上海深蓝机械装备有限公司 |