接口(python 中的協(xié)議)的多種不同的實(shí)現(xiàn)方式即為多態(tài)。多態(tài)的作用,就是為了類在繼承和派生的時(shí)候,保證使用“家譜”中任一類的實(shí)例的某一屬性時(shí)的正確調(diào)用。
創(chuàng)新互聯(lián)建站是一家集網(wǎng)站建設(shè),永豐企業(yè)網(wǎng)站建設(shè),永豐品牌網(wǎng)站建設(shè),網(wǎng)站定制,永豐網(wǎng)站建設(shè)報(bào)價(jià),網(wǎng)絡(luò)營(yíng)銷,網(wǎng)絡(luò)優(yōu)化,永豐網(wǎng)站推廣為一體的創(chuàng)新建站企業(yè),幫助傳統(tǒng)企業(yè)提升企業(yè)形象加強(qiáng)企業(yè)競(jìng)爭(zhēng)力??沙浞譂M足這一群體相比中小企業(yè)更為豐富、高端、多元的互聯(lián)網(wǎng)需求。同時(shí)我們時(shí)刻保持專業(yè)、時(shí)尚、前沿,時(shí)刻以成就客戶成長(zhǎng)自我,堅(jiān)持不斷學(xué)習(xí)、思考、沉淀、凈化自己,讓我們?yōu)楦嗟钠髽I(yè)打造出實(shí)用型網(wǎng)站。
可以看到,在上面的代碼中,只要實(shí)現(xiàn)了 Dock 類中的 swimming 和 Walk 方法,那么這個(gè)類就可以被叫做 Dock 類
應(yīng)用場(chǎng)景 如: for 循環(huán), 在python 中 for 循環(huán)只能用于可迭代對(duì)象, 那么, 我自己定義的類實(shí)現(xiàn)了 __iter__協(xié)議(接口),這個(gè)實(shí)例類就是一個(gè)可迭代對(duì)象,可以被for 循環(huán)使用
python 中定義協(xié)議類協(xié)議使用 @abstractmethod 裝飾器,@abstractmethod 裝飾過(guò)的類是不能進(jìn)行初始化的,相對(duì)于c++中的純虛函數(shù)類
這個(gè)類只能當(dāng)做協(xié)議(接口)類
分段函數(shù)的代碼用python實(shí)現(xiàn)如下:
x=eval(input('輸入x的值:'))
if x!=0:
y=1/(2*x-1)
else:
y=0
print(y)
系統(tǒng)內(nèi)置的類是內(nèi)置實(shí)現(xiàn)的,沒(méi)有相關(guān)代碼。
如果要看,只能找python的源代碼來(lái)看_str的實(shí)現(xiàn),但那里頭也沒(méi)有多少,大部分都是調(diào)用外部庫(kù)實(shí)現(xiàn)的,沒(méi)多少python代碼。
一些python包中的功能,可以直接看相應(yīng)的py文件的代碼。
或者按下述方式:
啟動(dòng)Module Docs:
同時(shí)會(huì)彈出的瀏覽器窗口:
在其中選擇相應(yīng)的包,比如re包:
點(diǎn)擊紅框處的連接即可以瀏覽器中查看相應(yīng)py文件的代碼,或者在ide中打開(kāi)相應(yīng)的文件去查看。
如果某個(gè)包的方法調(diào)用產(chǎn)生了錯(cuò)誤,可以在ide中點(diǎn)擊相應(yīng)的連接以打開(kāi)相應(yīng)的py文件并定位到出錯(cuò)語(yǔ)句,這對(duì)所有的py文件都是有效的,但不是所有的ide都會(huì)有此功能。
在進(jìn)行新紀(jì)元時(shí)間(1970-01-01 00:00:00)以來(lái)的秒到實(shí)際時(shí)間之間轉(zhuǎn)換的時(shí)候 MySQL 根據(jù)參數(shù) time_zone 的設(shè)置有兩種選擇:
time_zone?設(shè)置為 SYSTEM 的話:使用 sys_time_zone 獲取的 OS 會(huì)話時(shí)區(qū),同時(shí)使用 OS API 進(jìn)行轉(zhuǎn)換。對(duì)應(yīng)轉(zhuǎn)換函數(shù) Time_zone_system::gmt_sec_to_TIME
time_zone?設(shè)置為實(shí)際的時(shí)區(qū)的話:比如 ‘+08:00’,那么使用使用 MySQL 自己的方法進(jìn)行轉(zhuǎn)換。對(duì)應(yīng)轉(zhuǎn)換函數(shù) Time_zone_offset::gmt_sec_to_TIME
實(shí)際上 Time_zone_system 和 Time_zone_offset 均繼承于 Time_zone 類,并且實(shí)現(xiàn)了 Time_zone 類的虛函數(shù)進(jìn)行了重寫(xiě),因此上層調(diào)用都是 Time_zone::gmt_sec_to_TIME。
實(shí)現(xiàn)一個(gè)binder通信實(shí)例,需要經(jīng)過(guò)以下步驟: (一)獲得ServiceManager的對(duì)象引用 (二)向ServiceManager注冊(cè)新的Service (三)在Client中通過(guò)ServiceManager獲得Service對(duì)象引用 (三)在Client中發(fā)送請(qǐng)求,由Service返回結(jié)果。 下面看具體的代碼如何實(shí)現(xiàn)。 三.一 libmyservice代碼實(shí)現(xiàn) (一)新建目錄frameworks/base/myservice/libservice,進(jìn)入該目錄 view plain $ cd frameworks/base $ mkdir myservice $ cd myservice $ mkdir libmyservice $ cd libmyservice (二)編寫(xiě)libmyservice/myservic.h文件 view plain #include threads.h #include RefBase.h #include IInterface.h #include BpBinder.h #include Parcel.h namespace android { class MyService : public BBinder { mutable Mutex mLock; int三二_t mNextConnId; public: static int instantiate(); MyService(); virtual ~MyService(); virtual status_t onTransact(uint三二_t, const Parcel, Parcel*, uint三二_t); }; }; //namespace (二)編寫(xiě)libservice/myservice.cpp文件 view plain #include "myservice.h" #include IServiceManager.h #include IPCThreadState.h namespace android { static struct sigaction oldact; static pthread_key_t sigbuskey; int MyService::instantiate() { LOGE("MyService instantiate"); // defaultServiceManager ()獲得ServiceManager的對(duì)象引用,addService()可向ServiceManager注冊(cè)新的服務(wù) int r = defaultServiceManager()-addService(String一陸("android.myservice"), new MyService()); LOGE("MyService r = %d/n", r); return r; } MyService::MyService() { LOGV("MyService created"); mNextConnId = 一; pthread_key_create(sigbuskey, NULL); } MyService::~MyService() { pthread_key_delete(sigbuskey); LOGV("MyService destroyed"); } // 每個(gè)系統(tǒng)服務(wù)都繼承自BBinder類,都應(yīng)重寫(xiě)B(tài)Binder的onTransact虛函數(shù)。當(dāng)用戶發(fā)送請(qǐng)求到達(dá)Service時(shí),系統(tǒng)框架會(huì)調(diào)用Service的onTransact函數(shù),該函數(shù)分析接收到的數(shù)據(jù)包,調(diào)用相應(yīng)的接口函數(shù)處理請(qǐng)求 status_t MyService::onTransact(uint三二_t code, const Parcel data, Parcel* reply, uint三二_t flags) { switch(code) { case 0: { pid_t pid = data.readInt三二(); int num = data.readInt三二(); num = num + 一00; reply-writeInt三二(num); return NO_ERROR; } break; default: return BBinder::onTransact(code, data, reply, flags); } } }; //namespace (三)編寫(xiě)libservice/Android.mk文件 view plain # File: Android.mk LOCAL_PATH := $(call my-dir) include $(CLEAR_VARS) LOCAL_SRC_FILES := myservice.cpp LOCAL_C_INCLUDES := $(JNI_H_INCLUDE) LOCAL_SHARED_LIBRARIES := libutils libbinder LOCAL_MODULE_TAGS := optional LOCAL_PRELINK_MODULE := false LOCAL_MODULE := libmyservice include $(BUILD_SHARED_LIBRARY) (四)編譯libmyservice.so動(dòng)態(tài)庫(kù) 在android源碼主目錄下 view plain $ source build/envsetup.sh including device/htc/passion/vendorsetup.sh including device/samsung/crespo四g/vendorsetup.sh including device/samsung/crespo/vendorsetup.sh $ mmm frameworks/base/myservice/libmyservice/ 編譯成功后生成文件:out/target/product/generic/system/lib/libmyservice.s
雖然官方 Python 實(shí)現(xiàn)差不多得到最廣泛的歡迎,但也有一些其他實(shí)現(xiàn)對(duì)特定領(lǐng)域的用戶來(lái)說(shuō)更具吸引力。
知名的實(shí)現(xiàn)包括:
CPython
這是最早出現(xiàn)并持續(xù)維護(hù)的 Python 實(shí)現(xiàn),以 C 語(yǔ)言編寫(xiě)。新的語(yǔ)言特性通常在此率先添加。
Jython
以 Java 語(yǔ)言編寫(xiě)的 Python 實(shí)現(xiàn)。此實(shí)現(xiàn)可以作為 Java 應(yīng)用的一個(gè)腳本語(yǔ)言,或者可以用來(lái)創(chuàng)建需要 Java 類庫(kù)支持的應(yīng)用。想了解更多信息可訪問(wèn) Jython 網(wǎng)站。
Python for .NET
此實(shí)現(xiàn)實(shí)際上使用了 CPython 實(shí)現(xiàn),但是屬于 .NET 托管應(yīng)用并且可以引入 .NET 類庫(kù)。它的創(chuàng)造者是 Brian Lloyd。想了解詳情可訪問(wèn) Python for .NET 主頁(yè)。
IronPython
另一個(gè) .NET 的 Python 實(shí)現(xiàn),與 Python.NET 不同點(diǎn)在于它是生成 IL 的完全 Python 實(shí)現(xiàn),并且將 Python 代碼直接編譯為 .NET 程序集。它的創(chuàng)造者就是當(dāng)初創(chuàng)造 Jython 的 Jim Hugunin。想了解詳情可訪問(wèn) IronPython 網(wǎng)站。
PyPy
完全使用 Python 語(yǔ)言編寫(xiě)的 Python 實(shí)現(xiàn)。它支持多個(gè)其他實(shí)現(xiàn)所沒(méi)有的高級(jí)特性,例如非棧式支持和 JIT 編譯器等。此項(xiàng)目的目標(biāo)之一是通過(guò)允許方便地修改解釋器 (因?yàn)樗怯?Python 編寫(xiě)的),鼓勵(lì)該對(duì)語(yǔ)言本身進(jìn)行試驗(yàn)。想了解詳情可訪問(wèn) PyPy 項(xiàng)目主頁(yè)。
以上這些實(shí)現(xiàn)都可能在某些方面與此參考文檔手冊(cè)的描述有所差異,或是引入了超出標(biāo)準(zhǔn) Python 文檔范圍的特定信息。請(qǐng)參考它們各自的專門(mén)文檔,以確定你正在使用的這個(gè)實(shí)現(xiàn)有哪些你需要了解的東西。
以 Java 語(yǔ)言編寫(xiě)的 Python 實(shí)現(xiàn)。此實(shí)現(xiàn)可以作為 Java 應(yīng)用的一個(gè)腳本語(yǔ)言,或者可以用來(lái)創(chuàng)建需要 Java 類庫(kù)支持的應(yīng)用。想了解更多信息可訪問(wèn) Jython 網(wǎng)站。
Python for .NET
此實(shí)現(xiàn)實(shí)際上使用了 CPython 實(shí)現(xiàn),但是屬于 .NET 托管應(yīng)用并且可以引入 .NET 類庫(kù)。它的創(chuàng)造者是 Brian Lloyd。想了解詳情可訪問(wèn) Python for .NET 主頁(yè)。
IronPython
另一個(gè) .NET 的 Python 實(shí)現(xiàn),與 Python.NET 不同點(diǎn)在于它是生成 IL 的完全 Python 實(shí)現(xiàn),并且將 Python 代碼直接編譯為 .NET 程序集。它的創(chuàng)造者就是當(dāng)初創(chuàng)造 Jython 的 Jim Hugunin。想了解詳情可訪問(wèn) IronPython 網(wǎng)站。