已有字符串形式的函數(shù)名稱,那么如何調(diào)用這個函數(shù)呢?
創(chuàng)新互聯(lián)公司是網(wǎng)站建設(shè)技術(shù)企業(yè),為成都企業(yè)提供專業(yè)的成都網(wǎng)站設(shè)計、成都網(wǎng)站制作、外貿(mào)網(wǎng)站建設(shè),網(wǎng)站設(shè)計,網(wǎng)站制作,網(wǎng)站改版等技術(shù)服務(wù)。擁有十余年豐富建站經(jīng)驗(yàn)和眾多成功案例,為您定制適合企業(yè)的網(wǎng)站。十余年品質(zhì),值得信賴!
通過調(diào)用內(nèi)置函數(shù)locals()和globals()返回的字典對象,就可以可以獲得名稱與對象的映射關(guān)系。其中,locals()僅在全局范圍內(nèi)調(diào)用時可以獲得函數(shù)對象。 我們來看以下的例子。
需要注意的是,使用上述方法通過字符串調(diào)用函數(shù)時,為了系統(tǒng)的安全,防止執(zhí)行任意函數(shù),需要對函數(shù)名做一些處理,也就是使用統(tǒng)一的前綴為這些函數(shù)命名。例如在上述例子中,使用前綴cmd_+函數(shù)名的形式定義函數(shù)(cmd_help,cmd_sum)。
在傳入函數(shù)名字符串時,只傳入函數(shù)名的后半部分(如"help","sum"),由程序添加前綴后組成完整的函數(shù)名,再調(diào)用該函數(shù)。
對于類的成員函數(shù),則可以使用getattr()獲得類成員函數(shù)。
上述代碼通過字符串調(diào)用了類成員函數(shù),與前一段代碼執(zhí)行的結(jié)果相同。
此外,還可以使用字典將字符串與函數(shù)對應(yīng)起來調(diào)用,缺點(diǎn)就是每增加一個函數(shù)需要相應(yīng)在字典對象中添加相應(yīng)的鍵值,增加代碼維護(hù)工作量。
以上代碼在Python 3.6以上運(yùn)行通過。
類,class,用來描述具有相同的屬性和方法的對象的集合。它定義了該集合中每個對象所共有的屬性和方法。對象是類的實(shí)例。
函數(shù),是組織好的,可重復(fù)使用的,用來實(shí)現(xiàn)單一,或相關(guān)聯(lián)功能的代碼段。
函數(shù)能提高應(yīng)用的模塊性,和代碼的重復(fù)利用率。你已經(jīng)知道python提供了許多內(nèi)建函數(shù),比如print()。但你也可以自己創(chuàng)建函數(shù),這被叫作用戶自定義函數(shù)。
python語言中類和函數(shù)的區(qū)別
1、規(guī)則不同
類是一種引用數(shù)據(jù)類型,類似于byte、short、int(char)、long、float、double等基本數(shù)據(jù)類型;
函數(shù)必須聲明后才可以被調(diào)用,調(diào)用格式為:函數(shù)名(實(shí)參)調(diào)用時函數(shù)名后的小括號中的實(shí)參必須和聲明函數(shù)時的函數(shù)括號中的形參個數(shù)相同。
2、主體不同
類是面向?qū)ο蟪绦蛟O(shè)計實(shí)現(xiàn)信息封裝的基礎(chǔ);
函數(shù)是指一段在一起的、可以做某一件事的子程序。
3、特點(diǎn)不同
類是一種用戶定義的引用數(shù)據(jù)類型,也稱類類型,每個類包含數(shù)據(jù)說明和一組操作數(shù)據(jù)或者傳遞消息的函數(shù),類的實(shí)例稱為對象;
函數(shù)分為全局函數(shù)、全局靜態(tài)函數(shù),在類中還可以定義構(gòu)造函數(shù)、析構(gòu)函數(shù)、拷貝構(gòu)造函數(shù)、成員函數(shù)、友元函數(shù)、運(yùn)算符重載函數(shù)、內(nèi)聯(lián)函數(shù)等。
本篇博客是滾雪球?qū)W Python 第二輪的最后一篇博客,我們將內(nèi)容繼續(xù)提升到面向?qū)ο蟛糠?,為你補(bǔ)充類里面的一些裝飾器,學(xué)習(xí)之后,希望你的 Python 基礎(chǔ)知識可以更上一層樓。
先直接看代碼,再對代碼內(nèi)容進(jìn)行分析與學(xué)習(xí)。
首先要掌握的是類函數(shù)的定義格式,在普通函數(shù)的前面添加裝飾器 @classmethod ,該函數(shù)就會轉(zhuǎn)換為類函數(shù),同時函數(shù)的第一個參數(shù)默認(rèn)是 cls ,該變量名可以任意,建議使用成 cls ,這個是程序員之間的約定。
在 Python 中,大部分 @classmethod 裝飾的函數(shù)末尾都是 return cls(XXX) , return XXX.__new__ () 也就是 @classmethod 的一個主要用途是作為構(gòu)造函數(shù)。
先掌握一個概念,靜態(tài)函數(shù)不屬于它所在的那個類,它是獨(dú)立于類的一個單獨(dú)函數(shù),只是寄存在一個類名下,先建立這個基本概念,后面學(xué)起來就簡單很多了。
在同一個類中,調(diào)用靜態(tài)方法,使用 類名.函數(shù)名() 的格式。
先創(chuàng)建一個父類,其中包含兩個靜態(tài)函數(shù)與一個類函數(shù)。
再編寫一個 S 類繼承自 F 類:
測試之后,基本結(jié)論如下:
如果在子類中覆蓋了父類的靜態(tài)函數(shù),那調(diào)用時使用的是子類自己的靜態(tài)函數(shù),
如果在子類中沒有覆蓋父類的靜態(tài)函數(shù),那調(diào)用時使用的是父類的靜態(tài)函數(shù),
類函數(shù)同樣遵循該規(guī)則。
如果希望在子類中調(diào)用父類的屬性或者函數(shù),請使用 父類名. 的形式實(shí)現(xiàn)。
被 @abstractmethod 裝飾的函數(shù)為抽象函數(shù),含抽象函數(shù)的類不能實(shí)例化,繼承了含抽象函數(shù)的子類必須覆蓋所有抽象函數(shù)裝飾的方法,未被裝飾的可以不重寫。
抽象類是一個特殊的類,它的特殊之處在于只能被繼承,不能被實(shí)例化,實(shí)現(xiàn)代碼如下:
抽象基類中學(xué)習(xí)還需要了解元類相關(guān)知識,在第三輪滾雪球?qū)W Python 中將為你展開這部分內(nèi)容。
在 Python 面向?qū)ο蟮木幋a過程中, 對象.屬性 來獲取屬性的值,使用 對象.方法() 來調(diào)用方法,通過裝飾器 @property 可以將一個方法偽裝成屬性,從而使用 對象.方法 沒有括號的形式調(diào)用。代碼非常簡單:
這種寫法最直接的應(yīng)用,就是將部分屬性變成只讀屬性,例如,上述代碼,你無法通過下述代碼對 name 進(jìn)行修改。
如果希望方法偽裝的屬性具備修改和刪除功能,需要參考下述代碼:
上述代碼在將 name 方法偽裝成屬性之后,可以通過 @name.setter 和 @name.deleter 對同名的 name 方法進(jìn)行裝飾,從而實(shí)現(xiàn)了修改與刪除功能。
所以一般使用方法偽裝屬性的步驟是:
如果你覺得這個比較麻煩,還存在一種方法偽裝屬性的方式。使用 property 函數(shù),原型如下
通過上述函數(shù)將方法偽裝成屬性的代碼為:
滾雪球?qū)W Python 第二輪 15 篇博客在一次結(jié)束了,下一輪將在 4 月中旬再次開啟,學(xué) Python 我們一直在路上,希望本系列的課程對你的 Python 學(xué)習(xí)有所助力。
9. 類
Python 的類機(jī)制通過最小的新語法和語義在語言中實(shí)現(xiàn)了類。它是 C++ 或者 Modula-3 語言中類機(jī)制的混合。就像模塊一樣,Python 的類并沒有在用戶和定義之間設(shè)立絕對的屏障,而是依賴于用戶不去“強(qiáng)行闖入定義”的優(yōu)雅。另一方面,類的大多數(shù)重要特性都被完整的保留下來:類繼承機(jī)制允許多重繼承,派生類可以覆蓋(override)基類中的任何方法或類,可以使用相同的方法名稱調(diào)用基類的方法。對象可以包含任意數(shù)量的私有數(shù)據(jù)。
用 C++ 術(shù)語來講,所有的類成員(包括數(shù)據(jù)成員)都是公有( public )的(其它情況見下文 私有變量),所有的成員函數(shù)都是虛( virtual )的。用 Modula-3 的術(shù)語來講,在成員方法中沒有簡便的方式引用對象的成員:方法函數(shù)在定義時需要以引用的對象做為第一個參數(shù),調(diào)用時則會隱式引用對象。像在 Smalltalk 中一個,類也是對象。這就提供了導(dǎo)入和重命名語義。不像 C++ 和 Modula-3 中那樣,大多數(shù)帶有特殊語法的內(nèi)置操作符(算法運(yùn)算符、下標(biāo)等)都可以針對類的需要重新定義。
在討論類時,沒有足夠的得到共識的術(shù)語,我會偶爾從 Smalltalk 和 C++ 借用一些。我比較喜歡用 Modula-3 的用語,因?yàn)楸绕?C++,Python 的面向?qū)ο笳Z法更像它,但是我想很少有讀者聽過這個。