日本综合一区二区|亚洲中文天堂综合|日韩欧美自拍一区|男女精品天堂一区|欧美自拍第6页亚洲成人精品一区|亚洲黄色天堂一区二区成人|超碰91偷拍第一页|日韩av夜夜嗨中文字幕|久久蜜综合视频官网|精美人妻一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時(shí)間:8:30-17:00
你可能遇到了下面的問題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營銷解決方案
Java帝國對Python的滲透能成功嗎?

引子

創(chuàng)新互聯(lián)于2013年開始,是專業(yè)互聯(lián)網(wǎng)技術(shù)服務(wù)公司,擁有項(xiàng)目網(wǎng)站制作、成都網(wǎng)站設(shè)計(jì)網(wǎng)站策劃,項(xiàng)目實(shí)施與項(xiàng)目整合能力。我們以讓每一個(gè)夢想脫穎而出為使命,1280元元謀做網(wǎng)站,已為上家服務(wù),為元謀各地企業(yè)和個(gè)人服務(wù),聯(lián)系電話:028-86922220

Java 帝國已經(jīng)成立20多年,經(jīng)過歷代國王的勵(lì)精圖治,可以說是地大物博,碼農(nóng)眾多。

可是國王依然不滿足,整天想著如何繼續(xù)開拓疆土, 這一天晚上他又把幾個(gè)重臣招來商議了。

IO大臣說:“陛下,現(xiàn)在天下大勢初定,我Java帝國已經(jīng)占據(jù)了后端開發(fā),大數(shù)據(jù),Android開發(fā)等重要地盤,再想拓展殊為不易!”

“是啊, 前端被JavaScript所盤踞,我們很難滲透啊。” 線程大臣補(bǔ)充。

國王點(diǎn)點(diǎn)頭,這話不錯(cuò),JavaScript一統(tǒng)前端,F(xiàn)lash消失了,Applet不見了。想到Applet,國王就一陣心痛,當(dāng)時(shí)Java是靠了Applet才引起碼農(nóng)的關(guān)注,一炮走紅,后來怎么就不行了呢?

“那人工智能呢?” 國王狠狠地問道。

“陛下明鑒,人工智能底層都是C/C++的地盤,應(yīng)用層被Python等所侵占。 ” JDBC大臣回答。

“云計(jì)算呢?”

“似乎是Go語言的地盤?!?/p>

“嘶——” 國王覺得有點(diǎn)牙疼。

IO大臣趕緊為君主分憂:“陛下,現(xiàn)在群雄涿鹿,八分天下,邊境戰(zhàn)火連年不息,陛下不僅維持住祖宗的基業(yè),還有不小的擴(kuò)展,已經(jīng)是一代圣主了,不過多年征戰(zhàn),民力維艱,老臣有一計(jì),也許能換來奇效?!?/p>

“愛卿快講!”

“老臣以為不戰(zhàn)而屈人之兵才是上策,作為世界***之王國,不僅要武力上震懾群雄,更要輸出我堂堂Java帝國之文化和價(jià)值觀?!?/p>

“什么文化和價(jià)值觀?”

“首先我們要大肆宣揚(yáng)靜態(tài)語言的種種好處,比如編譯期檢查發(fā)現(xiàn)錯(cuò)誤,代碼適合閱讀和維護(hù),適合大規(guī)模團(tuán)隊(duì)合作,口號(hào)我都想好了,就叫‘動(dòng)態(tài)一時(shí)爽,重構(gòu)火葬場!’ ”

“嗯,這口號(hào)不錯(cuò)!” 國王贊許,“愛卿真是老成謀國?!?/p>

“可是有些語言也是靜態(tài)的啊!你怎么宣傳?” 老對頭線程大臣發(fā)難。

“陛下您想想,我們有很多寶貝,” IO大臣根本不理線程大臣, 繼續(xù)侃侃而談:“ 比如IoC, AOP,反射、動(dòng)態(tài)代理、泛型、注解、JDBC、JMS...... 還有我們引以為豪的JVM。這些東西,那些國家可不一定有,我們派出傳教士,把這些東西灌輸給他們的臣民,讓他們體會(huì)到Java的種種好處,慢慢地就把他們給同化了!到時(shí)候他們的碼農(nóng)自然而然就會(huì)加入我Java帝國?!?/p>

“陛下萬萬不可,不同的語言有不同的特點(diǎn),我們的文化別人是接受不了的,到時(shí)候只會(huì)引起群雄恥笑。” 線程大臣覺得IO大臣腦洞大開,簡直是胡鬧,非要誤國不可。

“可以一試嘛!” 國王牙不疼了,“此事由IO大臣全權(quán)負(fù)責(zé),一年后看效果?!?/p>

泛型

作為被派往Python王國的傳教士,吉森帶著IO大臣的重托,風(fēng)塵仆仆,終于來到了Python 王國。

IO大臣在挑選人選的時(shí)候,有個(gè)重要的原則:是Java的死忠粉絲,***是對其他語言根本不了解,省得思想被污染。 這吉森就是其中的佼佼者。

吉森先找到一個(gè)地方安頓下來,然后邊四處閑逛, 他驚奇地發(fā)現(xiàn),這里類方法中的self 滿天飛, 還有強(qiáng)制代碼縮進(jìn),果然和我大Java不同,頗有異域風(fēng)情。

前面是個(gè)茶館,人聲鼎沸, 吉森走了進(jìn)去,看看能不能牛刀小試,宣揚(yáng)一下Java的文化。

“小二,我觀察了半天,你們這里怎么沒有討論泛型啊?” 吉森拉住上茶的店小二。

“泛型? 那是什么東西? ” 小二大惑不解。

“你肯定是個(gè)外鄉(xiāng)人,不是來自C++就是Java,我說得沒錯(cuò)吧?” 旁邊不知道什么時(shí)候來了一個(gè)老頭兒。

“老先生眼光不錯(cuò),我確實(shí)從Java王國來,我很納悶,這里怎么沒有泛型啊,據(jù)我所知, 泛型可以在編譯期做類型檢查,碼農(nóng)們在寫代碼的時(shí)候也不需要做類型的轉(zhuǎn)換,非常好用的啊?!?吉森開始灌輸Java的種種好處。

 
 
 
 
  1. List files = new ArrayList(); 
  2. String file = files.get(0); //不必做強(qiáng)制類型轉(zhuǎn)換  
  3. files.add(new File(.....)) ; // 編譯錯(cuò)誤 

“外鄉(xiāng)人,我們Python中的變量是不需要聲明類型的,不會(huì)做編譯期類型檢查,只有在運(yùn)行時(shí)才會(huì)檢查這個(gè)變量到底是什么類型,能否調(diào)用它的方法, 你說,我們要泛型有什么用?”

吉森大驚,臥槽,這IO大臣怎么沒告訴自己啊, 人家根本就沒這個(gè)需求!

想想我大Java費(fèi)了那么大勁兒去實(shí)現(xiàn)泛型,沒想到在Python這里完全無用武之地, 還輸出什么文化! 傳什么教!

反射

吉森覺得有點(diǎn)被IO大臣坑了! 不過多年的歷練只是讓他稍微慌亂,他馬上穩(wěn)住神,轉(zhuǎn)移話題: “先生所言極是,晚生還有一個(gè)問題,這Python能支持反射嗎? ”

在Java王國,人們經(jīng)常通過反射的方式來獲取一個(gè)類的屬性,方法,然后根據(jù)一個(gè)字符串的名稱來調(diào)用某個(gè)類的方法。

比如有個(gè)url : /user?action=login

系統(tǒng)根據(jù)約定解析它,確定類是User, 方法是login 。 然后就可以把User對象創(chuàng)建起來,通過反射調(diào)用login 方法。

 
 
 
 
  1. public class User{ 
  2.     public void login(...){ 
  3.     ...... 
  4.     } 

“哈哈哈,你這個(gè)外鄉(xiāng)人啊,你知道為什么我們Python是動(dòng)態(tài)語言嗎? 我們Python的反射功能不知道比你們Java強(qiáng)到哪里去了!來來來,我給你看個(gè)例子?!?/p>

 
 
 
 
  1. class User: 
  2.     def login(self): 
  3.         print("this is login") 

“現(xiàn)在我打印他所有的方法:”

 
 
 
 
  1. methods = [x for x, y in User.__dict__.items() if type(y) == FunctionType] 
  2.  
  3. print(methods)  #輸出 ['login'] 

“接下來我通過反射調(diào)用login 方法, 老夫很久沒寫代碼了,可能不太嚴(yán)謹(jǐn),你明白意思就行。”

 
 
 
 
  1. url = "/user?action=login" 
  2. #從url解析得到類和action,代碼略 
  3. clz = "User"   
  4. action = "login" 
  5.  
  6.  
  7. #根據(jù)名稱獲得User對象和方法 
  8. user = globals()[clz]() 
  9. func = getattr(user,action) #獲取login方法 
  10. func() #輸出This is login 

吉森看到這么寥寥幾行代碼,就實(shí)現(xiàn)了基本的反射, 真是靈活啊,這Python真是不錯(cuò),他都有點(diǎn)羨慕了。

動(dòng)態(tài)代理

不, 我肩負(fù)IO大臣的重托, 我是來傳教的,不能讓這老頭兒給洗腦了!

吉森想起來了一個(gè)大殺器:動(dòng)態(tài)代理,這可是Java的一個(gè)非?;A(chǔ)的技術(shù),可以在運(yùn)行時(shí)實(shí)現(xiàn)類和方法的增強(qiáng),比如在調(diào)用業(yè)務(wù)方法的前后加上事務(wù)管理,日志管理等功能,沒有動(dòng)態(tài)代理,AOP就別想了。

吉森說道:“老先生,Python怎么去實(shí)現(xiàn)動(dòng)態(tài)代理啊?”

老頭兒微微一笑:“Java Class有個(gè)缺點(diǎn), 一旦被裝入Java虛擬機(jī),就沒法修改了,想對他做增強(qiáng),只能修改字節(jié)碼創(chuàng)建新的類,對老的類做封裝,就是代理。但是Python是個(gè)動(dòng)態(tài)語言,在運(yùn)行時(shí)就可以修改啊,比如我可以動(dòng)態(tài)地給User類增加一個(gè)新的屬性,這一點(diǎn)你的Java做不到吧?”

 
 
 
 
  1. setattr(User,"name",'andy') 
  2. print(user.name) #andy 

吉森看得目瞪口呆,這真是顛覆了自己從小養(yǎng)成的世界觀: 一個(gè)類在運(yùn)行期是不能改變的,更不可能去增加什么屬性。

老頭兒又接著說:“你看看這個(gè)User類,和Proxy類,每次調(diào)用login方法的時(shí)候,我都可以動(dòng)態(tài)地創(chuàng)建一個(gè)新的方法出來,在這個(gè)新的方法中,就可以做各種手腳了?!?/p>

 
 
 
 
  1. class User: 
  2.     def login(self): 
  3.         print('user login') 
  4.     def logout(self): 
  5.         print('user logout') 
  6.  
  7. class Proxy: 
  8.  
  9.     def __init__(self, target): 
  10.         self.target = target 
  11.  
  12.     def __getattribute__(self, name): 
  13.         target = object.__getattribute__(self, "target") 
  14.         attr = object.__getattribute__(target, name) 
  15.  
  16.         if name == 'login'  : 
  17.             def newFunc(*args, **kwargs):   
  18.                 print ("login start") 
  19.                 result = attr(*args, **kwargs) 
  20.                 print( "login end") 
  21.                 return result 
  22.             return newFunc 
  23.         else : 
  24.             return attr 
  25.  
  26.  
  27. u = User() 
  28. p = Proxy(u) 
  29.  
  30. p.login() #實(shí)際上調(diào)用的是動(dòng)態(tài)創(chuàng)建的方法 
  31. p.logout() #調(diào)用的是原來的方法 

“你那個(gè)Proxy中的__getattribute__是什么東西啊? ” 吉森看到魔法都在這里,不由得發(fā)問。

“每當(dāng)你去調(diào)用一個(gè)方法(如login/logout),或者訪問一個(gè)字段的時(shí)候,Python都會(huì)通過__getattribute__先找到這個(gè)方法或者字段,然后才是真正的調(diào)用。”

“奧,原來如此,你通過__getattribute__做了手腳,如果名稱是login,就創(chuàng)建新的方法,在新的方法中除了調(diào)用老方法之外,還輸出了日志?!?/p>

“不錯(cuò),孺子可教!”

吉森現(xiàn)在是真心佩服動(dòng)態(tài)語言了,在Java中必須得在運(yùn)行時(shí)通過操縱字節(jié)碼來增強(qiáng),字節(jié)碼啊,那可不是一般人能玩的。這Python居然在源碼級別就把功能給增強(qiáng)了!

錦囊妙計(jì)

吉森有點(diǎn)懷疑自己此次Python王國之行的效果了,這可如何是好? 怎么回去向IO大臣復(fù)命? 當(dāng)初可是立下軍令狀的!

他突然想起臨行前,IO大臣曾經(jīng)送給自己三個(gè)錦囊,囑咐自己只有到了最危急的時(shí)刻才能打開,現(xiàn)在不開,更待何時(shí)?

往懷中一摸,就發(fā)現(xiàn)錦囊只剩下了兩個(gè),丟了一個(gè),這回去估計(jì)要?dú)㈩^, 管不了那么多了, 吉森迅速掏出一個(gè),只見上面寫著一段話: GIL (全局解釋鎖), GIL是Python的命門, 這把超級大鎖只允許一個(gè)線程獲得Python解釋器的控制權(quán), 簡單來說,同一時(shí)刻,只有一個(gè)線程能運(yùn)行!

沒想到老頭兒淡淡一笑:“Python確實(shí)有GIL,可是這程序的瓶頸啊,它不在CPU, 而在于IO, 就是用戶的輸入,數(shù)據(jù)庫的查許,網(wǎng)絡(luò)的訪問, 線程等到有IO操作的時(shí)候,放棄GIL這個(gè)超級大鎖,讓別的線程去執(zhí)行就是了。再說了,你真想利用多核的時(shí)候可以用多個(gè)進(jìn)程啊!”

***個(gè)錦囊妙計(jì)被輕松化解, 吉森趕緊掏出第二個(gè),上面幾個(gè)字:“動(dòng)態(tài)一時(shí)爽,重構(gòu)火葬場?!?/p>

“哈哈哈,”老頭兒狡黠地笑了起來:“這都是不了解情況的外人的誤解,聽說過Quora沒有? 奧,上不了是吧! 這Quora就是Python寫的,人家那測試用例寫得非常充分,重構(gòu)也不怕! 所以啊關(guān)鍵是測試用例!”

第二個(gè)妙計(jì)又被化解, 吉森徹底沒轍了。

真相大白

看到吉森的神色變化,老頭兒開始表明身份:“實(shí)不相瞞,老夫乃是Python國王的特使,我們的探子早就聽說你們Java那什么破傳教士計(jì)劃了,你一進(jìn)入我國,就被盯上了,國王特地派我來,看看能不能說服你,留在我國?!?/p>

吉森想想,回去也無法交差,這Python似乎還不錯(cuò),進(jìn)退兩難之際,不妨先妥協(xié),以圖將來,于是點(diǎn)點(diǎn)頭答應(yīng)了。

一年以后, IO大臣開始盤點(diǎn)傳教士計(jì)劃,發(fā)現(xiàn)回來復(fù)命的***,尤其是去Python王國的吉森, 他怎么一點(diǎn)消息都沒有呢? 是時(shí)候再派一個(gè)人去了......

【本文為專欄作者“劉欣”的原創(chuàng)稿件,轉(zhuǎn)載請通過作者微信公眾號(hào)coderising獲取授權(quán)】

戳這里,看該作者更多好文


文章題目:Java帝國對Python的滲透能成功嗎?
網(wǎng)站URL:http://www.dlmjj.cn/article/dphoosj.html