第7篇 Cython封裝C++代碼(中)

至此稿蹲,我們已經(jīng)在pyx文件的命名空間中公開(kāi)了C ++ MoneyFormator類(lèi)型的接口暴区。 現(xiàn)在紧武,我們需要使它可以從外部Python代碼訪(fǎng)問(wèn)(這是我們的重點(diǎn))在前一篇文章我們通過(guò)面向過(guò)程的編程方式已經(jīng)實(shí)現(xiàn)了晌畅。


常見(jiàn)的編程實(shí)踐是創(chuàng)建一個(gè)Cython擴(kuò)展類(lèi)型,該類(lèi)型將封裝后的C ++類(lèi)實(shí)例作為屬性静袖,并創(chuàng)建一堆Cython類(lèi)的方法液南,這些類(lèi)方法內(nèi)部調(diào)用C++類(lèi)實(shí)例的對(duì)應(yīng)的方法。 因此勾徽,將前一篇中currency.pxd中的Cython類(lèi)接口導(dǎo)入到一個(gè)全新的pyx文件中,這里命名為monfmt.pyx统扳,我們重新創(chuàng)建一個(gè)擴(kuò)展模塊喘帚,該模塊內(nèi)部就是使用Cython擴(kuò)展類(lèi)來(lái)調(diào)用C++類(lèi)的接口,如下代碼所示咒钟。

#distutils:language=c++
#cython:language_level=3

from currency cimport MoneyFormator as _MoneyFormat
from libcpp.string cimport string

#https://stackoverflow.com/questions/13201886/cython-and-constructors-of-classes
cdef class MoneyFormator:

    cdef _MoneyFormat* fmt
    cdef public double digit
        
    def __cinit__(self,str locName="zh_CN.UTF-8",double n=0.0):
        if locName=='zh_CN.UTF-8':
            self.fmt=new _MoneyFormat()
        else:
            self.fmt=new _MoneyFormat(locName.encode('utf-8'))

        self.digit=n
    
    cpdef string format(self,double value):
        self.digit=value
        return self.fmt.str(value)
    
    def __repr__(self):
        if self.fmt!=NULL and self.digit>0:
            return self.fmt.str(self.digit).decode("utf-8")
        else:
            return self.fmt.str(0).decode('utf-8')
    
    def __dealloc__(self):
        if self.fmt!=NULL:
            del self.fmt
         

這個(gè)Cython類(lèi)語(yǔ)法上沒(méi)什么好說(shuō)的吹由,我假設(shè)你已經(jīng)閱讀過(guò)前6篇Cython編程隨筆了,在Python代碼中調(diào)用如下圖所示朱嘴。


ss8.png

Cython類(lèi)方法的重載問(wèn)題

唯一注意的是倾鲫,上面的調(diào)用示例粗合,我們剛開(kāi)始以默認(rèn)的參數(shù)實(shí)例化了MoneyFormator對(duì)象fmt,我們調(diào)用時(shí)沒(méi)有傳遞參數(shù),但實(shí)際上我們調(diào)用了一個(gè)帶參數(shù)的構(gòu)造函數(shù),而非默認(rèn)構(gòu)造乌昔,其原型是

MoneyFormator. __ cinit __(self,str,double)

其實(shí)這里我們要討論一個(gè)額外的問(wèn)題就是Cython擴(kuò)展類(lèi)方法的重載(Overloaded),注意而非重寫(xiě),讀者千萬(wàn)不能將C/C++/Java這類(lèi)面向?qū)ο笳Z(yǔ)言中的重載概念套在Cython擴(kuò)展類(lèi)中隙疚,因?yàn)镃ython重載的特性體現(xiàn)兩個(gè)方面。我們理解Cython重載問(wèn)題過(guò)程中磕道,我們重溫一下重載的概念:

重載就是為具有兩個(gè)或以上具有相同名稱(chēng)但參數(shù)不同的函數(shù)的過(guò)程供屉,在C/C++中稱(chēng)為函數(shù)重載。 在函數(shù)重載中溺蕉,通過(guò)使用不同類(lèi)型參數(shù)不同數(shù)量參數(shù)來(lái)重新定義函數(shù)伶丐。 只有通過(guò)這些差異,編譯器才能區(qū)分功能疯特。重載的意義是它可以提高程序的可讀性哗魂,因?yàn)槟鸁o(wú)需為同一操作使用不同的名稱(chēng)。

首先由關(guān)鍵字def函數(shù)定義類(lèi)方法漓雅,它本質(zhì)上是一個(gè)Python函數(shù),意味著所有def關(guān)鍵字定義的類(lèi)方法录别,由Python來(lái)解析,因?yàn)镻ython的C底層實(shí)現(xiàn)結(jié)構(gòu)故硅。決定了無(wú)法像原生C/C++那樣可以識(shí)別不同函數(shù)指針

更新中....

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末庶灿,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子吃衅,更是在濱河造成了極大的恐慌往踢,老刑警劉巖,帶你破解...
    沈念sama閱讀 222,104評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件徘层,死亡現(xiàn)場(chǎng)離奇詭異峻呕,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)趣效,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,816評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門(mén)瘦癌,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人跷敬,你說(shuō)我怎么就攤上這事讯私。” “怎么了西傀?”我有些...
    開(kāi)封第一講書(shū)人閱讀 168,697評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵斤寇,是天一觀(guān)的道長(zhǎng)。 經(jīng)常有香客問(wèn)我拥褂,道長(zhǎng)娘锁,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 59,836評(píng)論 1 298
  • 正文 為了忘掉前任饺鹃,我火速辦了婚禮莫秆,結(jié)果婚禮上间雀,老公的妹妹穿的比我還像新娘。我一直安慰自己镊屎,他們只是感情好惹挟,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,851評(píng)論 6 397
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著杯道,像睡著了一般匪煌。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上党巾,一...
    開(kāi)封第一講書(shū)人閱讀 52,441評(píng)論 1 310
  • 那天萎庭,我揣著相機(jī)與錄音,去河邊找鬼齿拂。 笑死驳规,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的署海。 我是一名探鬼主播吗购,決...
    沈念sama閱讀 40,992評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼砸狞!你這毒婦竟也來(lái)了捻勉?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 39,899評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤刀森,失蹤者是張志新(化名)和其女友劉穎踱启,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體研底,經(jīng)...
    沈念sama閱讀 46,457評(píng)論 1 318
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡埠偿,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,529評(píng)論 3 341
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了榜晦。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片冠蒋。...
    茶點(diǎn)故事閱讀 40,664評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖乾胶,靈堂內(nèi)的尸體忽然破棺而出抖剿,到底是詐尸還是另有隱情,我是刑警寧澤识窿,帶...
    沈念sama閱讀 36,346評(píng)論 5 350
  • 正文 年R本政府宣布斩郎,位于F島的核電站,受9級(jí)特大地震影響腕扶,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜吨掌,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,025評(píng)論 3 334
  • 文/蒙蒙 一半抱、第九天 我趴在偏房一處隱蔽的房頂上張望脓恕。 院中可真熱鬧,春花似錦窿侈、人聲如沸炼幔。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 32,511評(píng)論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)乃秀。三九已至,卻和暖如春圆兵,著一層夾襖步出監(jiān)牢的瞬間跺讯,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,611評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工殉农, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留刀脏,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 49,081評(píng)論 3 377
  • 正文 我出身青樓超凳,卻偏偏與公主長(zhǎng)得像愈污,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子轮傍,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,675評(píng)論 2 359