锘??xml version="1.0" encoding="utf-8" standalone="yes"?> Boost錛嶱ython鏄竴涓紑婧愮殑C++紼嬪簭搴擄紝鎻愪緵綾諱技IDL鐨勬帴鍙f潵鎶奀++綾誨拰鍑芥暟緇戝畾鍒癙ython銆傚熷姪浜嶤++寮哄ぇ鐨勭紪璇戞椂鍐呯渷(introspection)鑳藉姏鍜屾渶鏂扮殑鍏冪紪紼?metaprogramming)鎶鏈紝瀹冨畬鍏ㄧ敤C++鏉ュ疄鐜幫紝鑰屼笉鐢ㄥ紩鍏ユ柊鐨勮娉曘侭oost.Python涓板瘜鐨勭壒鎬у拰楂樼駭鎺ュ彛浣夸粠搴曞眰璧鋒寜娣峰悎緋葷粺鐨勬柟寮忚璁$粍浠舵垚涓哄彲鑳斤紝浠庤屼嬌紼嬪簭鍛樺彲浠ヨ交鏉懼拰榪炶瘡鐨勫悓鏃朵嬌鐢–++楂樻晥鐨勭紪璇戞椂澶氭佸拰Python鏋佸叾鏂逛究鐨勮繍琛屾椂澶氭併?/p> 浣滀負涓ら棬璇█錛宲ython鍜孋++鍦ㄥ緢澶氭柟闈笉涓鏍楓侰++琚紪璇戜負鏈哄櫒鐮侊紝python琚В閲?interpreted)鎵ц銆侾ython鐨勫姩鎬佺被鍨?type)緋葷粺緇忓父琚涓烘槸鐏墊椿鎬х殑鍩虹錛孋++鐨勯潤鎬佺被鍨嬫槸鏁堢巼鐨勫熀鐭熾侰++鏈夊鏉傝壈娣辯殑緙栬瘧鏃跺厓璇█(meta-language)錛岃屽湪python閲岋紝瀹為檯涓婁竴鍒囬兘鍦ㄨ繍琛屾椂鍙戠敓銆傜劧鑰屽寰堝紼嬪簭鍛樻潵璇達紝榪欎簺涓嶅悓鎭板ソ鎰忓懗鐫Python鍜孋++鏄郊姝ょ殑瀹岀編琛ヨ凍銆侾ython 紼嬪簭閲岀殑鎬ц兘鐡墮閮ㄥ垎鍙互鐢–++鏉ラ噸鍐欙紝浠庤屾渶澶у寲閫熷害銆傚己澶х殑C++紼嬪簭搴撶殑浣滆呴夋嫨Python浣滀負涓棿浠?middleware)璇█錛屼粠鑰岃幏寰楃伒媧葷殑緋葷粺闆嗘垚鑳藉姏銆傛澶栵紝琛ㄩ潰鐨勪笉鍚屾帺鐩栦簡浜岃呴潪甯哥被浼肩殑涓浜涘湴鏂癸細 鑰冭檻鍒癙ython涓板瘜鐨勨機'鍗忎綔API錛屽師鍒欎笂鎶奀++鐨勭被鍨嬪拰鍑芥暟浠ョ被浼間簬鏆撮湶緇機++鐨勬帴鍙f毚闇茬粰Python鏄彲鑳界殑銆傜劧鑰岋紝鍗曟槸Python鎻愪緵鐨勮繖縐嶈鏂藉闆嗘垚C++鐨勬敮鎸佹瘮杈冨急銆傚拰C++錛孭ython鐩告瘮錛屸機'鐨勬娊璞℃満鍒墮潪甯稿垵綰э紝鑰屼笖瀹屽叏涓嶆敮鎸佸紓甯稿鐞嗐傗機'鎵╁睍妯″潡鐨勪綔鑰呭繀欏繪墜鍔ㄧ鐞嗗紩鐢ㄨ鏁幫紝榪欎笉浣嗚浜烘伡鐏殑楹葷儲鍜屽崟璋冿紝榪樻瀬搴﹀鏄撳嚭閿欍備紶緇熺殑鎵╁睍妯″潡瀹規(guī)槗浜х敓閲嶅鐨勬牱鏉夸唬鐮?boilerplate code)錛屼粠鑰岄毦浜庣淮鎶わ紝灝ゅ叾鏄鍖呰鐨凙PI寰堝鏉傛椂銆?/p> 涓婅堪闄愬埗瀵艱嚧浜嗕竴浜涘寘瑁呯郴緇熺殑寮鍙戙係WIG_ 鍙兘鏄泦鎴怌/C++鍜孭ython鐨勫寘瑁呯郴緇熶腑鏈嫻佽鐨勩備竴涓洿榪戠殑渚嬪瓙鏄?SIP 錛屽畠涓撻棬璁捐鏉ユ彁渚?Qt 鍥懼艦鐢ㄦ埛鐣岄潰搴撶殑Python鎺ュ彛銆係WIG鍜孲IP閮藉紩鍏ヤ簡瀹冧滑涓撴湁鐨勮璦鏉ュ疄鐜拌璦闂寸粦瀹氥傝繖褰撶劧鏈夊畠鐨勫ソ澶勶紝浣嗕笉寰椾笉搴斾粯涓夌涓嶅悓鐨勮璦(Python錛孋/C++鍜屾帴鍙h璦)涔熷甫鏉ヤ簡瀹為檯鐨勫拰蹇冪悊涓婄殑鍥伴毦銆?CXX 杞歡鍖呭睍紺哄嚭瀹冩槸涓涓湁瓚g殑鍖呰緋葷粺銆傚畠璇存槑浜嗚嚦灝戜竴閮ㄤ喚Python 鈥楥鈥?API鍙互閫氳繃鐢ㄦ埛鍙嬪ソ寰楀鐨凜++鎺ュ彛鏉ュ寘瑁呭拰琛ㄧ幇銆傜劧鑰岋紝鍜孲WIG鍜孲IP涓嶄竴鏍鳳紝CXX涓嶆敮鎸佹妸C++綾誨寘瑁呮垚鏂扮殑Python綾誨瀷銆?/p> Boost.Python 鐨勭壒鎬у拰鐩爣鍜屽緢澶氳繖鏍風(fēng)殑緋葷粺鏈夌浉褰撶▼搴︾殑閲嶅彔銆傚氨鏄錛孊oost.Python璇曞浘鏈澶у寲渚垮埄鎬у拰鐏墊椿鎬э紝鑰屼笉寮曞叆鍗曠嫭鐨勫寘瑁呰璦銆傜浉鍙嶏紝瀹冨湪騫曞悗鐢ㄩ潤鎬佸厓緙栫▼鎶鏈鐞嗗緢澶氬鏉傞棶棰橈紝璧嬩簣浜嗙敤鎴烽氳繃楂樼駭C++鎺ュ彛鏉ュ寘瑁匔++綾誨拰鍑芥暟鐨勮兘鍔涳紝Boost.Python涔熷湪濡備笅棰嗗煙瓚呰秺浜嗘棭鏈熺殑緋葷粺錛?/p> 榧撹垶Boost.Python寮鍙戠殑鍏抽敭鍙戠幇鏄紝浼犵粺鎵╁睍寮鍙戜腑鐨勫ぇ閲忔牱鏉夸唬鐮侀兘鍙互閫氳繃C++緙栬瘧鏃跺唴鐪佹潵娑堥櫎銆傝鍖呰鐨凜++鍑芥暟鐨勬瘡涓弬鏁伴兘蹇呴』鏍規(guī)嵁鍙傛暟綾誨瀷浠嶱ython瀵硅薄閲屽彇鍑烘潵銆傜被浼煎湴錛屽嚱鏁拌繑鍥炲肩殑綾誨瀷鍐沖畾浜嗚繑鍥炲煎浣曚粠C++杞崲鎴怭ython銆傚弬鏁扮被鍨嬪拰榪斿洖鍊肩被鍨嬪綋鐒墮兘鏄瘡涓嚱鏁扮殑綾誨瀷鐨勪竴閮ㄥ垎錛屾鏄粠榪欓噷錛孊oost.Python鎺ㄥ鍑轟簡澶ч儴鍒嗛渶瑕佺殑淇℃伅銆?/p> 榪欑鏂規(guī)硶瀵煎悜浜?鐢ㄦ埛寮曞鐨勫寘瑁?/em> 錛氬敖鍙兘鐨勭敤綰疌++鐨勬鏋剁洿鎺ヤ粠瑕佸寘瑁呯殑浠g爜閲屽彇寰椾俊鎭紝榪欎互澶栫殑淇℃伅鐢辯敤鎴鋒樉寮忔彁渚涖傚ぇ澶氭暟寮曞鏄嚜鍔ㄧ殑錛屽緢灝戦渶瑕佺湡姝g殑騫叉秹銆傚洜涓哄啓鎺ュ彛瑙勮寖鍜屽啓琚毚闇茬殑浠g爜鐨勬槸鍚屼竴闂ㄥ叏鍔熻兘璇█錛屽綋闇瑕佸彇寰楁帶鍒舵椂鐢ㄦ埛鏈変簡絀哄墠寮哄ぇ鐨勮兘鍔涖?/p> Boost.Python鐨勯瑕佺洰鏍囨槸璁╃敤鎴峰彧鐢–++緙栬瘧鍣ㄥ氨鑳藉悜Python鏆撮湶C++綾誨拰鍑芥暟銆傚ぇ浣撴潵璁詫紝鍏佽鐢ㄦ埛鐩存帴浠嶱ython鎿嶄綔C++瀵硅薄銆?/p> 鐒惰岋紝鏈変竴鐐瑰緢閲嶈錛岄偅灝辨槸涓嶈 榪囦簬 鎸夊瓧闈㈢炕璇戞墍鏈夋帴鍙o細蹇呴』鑰冭檻姣忕璇█鐨勬儻鐢ㄨ銆備緥濡傦紝铏界劧C++鍜孭ython閮芥湁榪唬鍣ㄧ殑姒傚康錛岃〃杈炬柟寮忓嵈寰堜笉涓鏍楓侭oost.Python蹇呴』鑳借繛鎺ヨ繖浜涗笉鍚岀殑鎺ュ彛銆?/p> 蹇呴』鎶奝ython鐢ㄦ埛鍜孋++鎺ュ彛鐨勫井灝忚鐢ㄩ犳垚鐨勫穿婧冮殧紱匯傚嚭浜庡悓鏍峰師鍥狅紝搴旇鎶奀++鐢ㄦ埛鍜屼綆綰ython 鈥楥鈥?API闅旂錛屽鏄撳嚭閿欑殑C鎺ュ彛錛屾瘮濡傛墜鍔ㄥ紩鐢ㄨ鏁扮鐞嗭紝鍘熷鐨?raw)PyObject鎸囬拡錛屽簲璇ョ敤鏇村姞鍋ュ.鐨?more-robust)鏇夸唬鐗╂潵鍙栦唬銆?/p> 鏀寔鍩轟簬緇勪歡鐨勫紑鍙戞槸鑷沖叧閲嶈鐨勶紝鍥犳琚毚闇插湪涓涓墿灞曟ā鍧楅噷鐨凜++綾誨瀷搴旇鑳藉琚紶閫掔粰琚毚闇插湪鍙︿竴涓ā鍧椾腑鐨勫嚱鏁幫紝鑰屼笉涓㈠け閲嶈鐨勪俊鎭紝姣斿璇碈++緇ф壙鍏崇郴銆?/p> 鏈鍚庯紝鎵鏈夌殑鍖呰蹇呴』鏄?闈炰鏡鍏ョ殑(non-intrusive) 錛屼笉鑳戒慨鏀圭敋鑷崇湅涓嶅埌鍘熷鐨凜++浠g爜銆傚鍙兘鐪嬭瀹冨ご鏂囦歡鍜屼簩榪涘埗鏂囦歡鐨勭涓夋柟錛岀幇鏈夌殑C++搴撳繀欏繪槸鍙寘瑁呯殑銆?/p> 鐜板湪鏉ラ瑙堜竴涓婤oost.Python錛屽茍鐪嬬湅瀹冨浣曟敼榪汸ython鐨勫師濮嬪寘瑁呭姛鑳姐備笅闈㈡槸鎴戜滑鎯蟲毚闇茬殑涓涓嚱鏁? 鐢≒ython鐨凜 API鍜屾爣鍑咰++鏉ュ寘瑁呰繖涓嚱鏁幫紝鎴戜滑闇瑕佸儚榪欐牱: 鐜板湪鐪嬬湅鎴戜滑浣跨敤Boost.Python鏉ユ毚闇插畠鏃剁殑鍖呰浠g爜: 涓嬮潰鏄嬌鐢ㄥ畠鐨勪唬鐮? C API鐗堟湰瑕佸啑闀跨殑澶氾紝姝ゅ錛屼竴浜涘畠娌℃湁姝g‘澶勭悊鐨勫湴鏂瑰煎緱鎻愬埌錛?/p> 榪欓儴鍒嗙畝瑕佹弿榪頒簡搴撶殑涓昏鐗規(guī)с備負浜嗛伩鍏嶆販娣嗭紝蹇界暐浜嗗疄鐜扮粏鑺傘?/p> C++綾誨拰緇撴瀯浠ョ被浼肩殑綆媧佺殑鎺ュ彛鏉ユ毚闇層傚亣璁炬湁: 涓嬮潰鐨勪唬鐮佸皢鍦ㄦ垜浠殑鎵╁睍妯″潡閲屾毚闇插畠: 灝界涓婅堪浠g爜鏈夋煇縐嶇啛鎮(zhèn)夌殑Pythonic鐨勬劅瑙夛紝浣嗚娉曟湁鏃惰繕鏄湁鐐逛護浜鴻糠鎯戯紝鍥犱負瀹冪湅璧鋒潵涓嶅儚浜轟滑涔犳儻鐨凜++浠g爜銆備絾鏄紝榪欎粛鐒跺彧鏄爣鍑咰++銆傚洜涓哄畠浠伒媧葷殑璇硶鍜屾搷浣滅閲嶈澆錛孋++鍜孭ython閮藉緢閫備簬瀹氫箟鐗瑰畾棰嗗煙(瀛?璇█( domain-specific (sub)languages) (DSLs)銆傞偅灝辨槸鎴戜滑鍦˙oost.Python閲屾墍鍋氱殑銆傛妸浠g爜鎷嗗紑鏉ョ湅: 鏋勯犵被鍨媍lass_<World>鐨勬湭鍛藉悕瀵硅薄錛屾妸"World"浼犵粰瀹冪殑鏋勯犲櫒銆傝繖灝嗗湪鎵╁睍妯″潡閲屽垱寤轟竴涓彨World鐨刵ew-style Python綾伙紝騫舵妸瀹冨拰C++綾誨瀷World鍦˙oost.Python鐨勭被鍨嬭漿鎹㈡敞鍐岃〃閲屽叧鑱旇搗鏉ャ傛垜浠篃鍙互榪欎箞鍐? 浣嗛偅鏍峰仛鐨勮瘽浼氭洿綣佺悙錛屽洜涓烘垜浠笉寰椾笉鍐嶆鍛藉悕w浠ヨ皟鐢ㄥ畠鐨刣ef()鎴愬憳鍑芥暟: 鍘熸潵鐨勪緥瀛愰噷琛ㄧず鎴愬憳榪涘叆鐨勭偣鐨勪綅緗病鏈変粈涔堢壒鍒殑錛欳++鍏佽浠繪剰鐨勭┖鐧界鍑虹幇鍦ㄨ〃鎰忕鍙?token)鐨勪換涓杈癸紝鎶婄偣鏀懼湪姣忚鐨勫紑濮嬪厑璁哥敤緇熶竴鐨勮娉曟妸榪炵畫鐨勮皟鐢ㄩ兘涓茶搗鏉ワ紝涓嶇鎴戜滑鎯充覆澶氬皯閮借銆傚彟涓涓厑璁哥殑涓叉帴鐨勪簨瀹炴槸class_<>鎴愬憳鍑芥暟閮借繑鍥炲*this鐨勫紩鐢ㄣ?/p> 鍥犳鍘熸潵鐨勪緥瀛愮瓑鍚屼簬: 鑳借繖鏍鋒媶鍒咮oost.Python綾誨寘瑁呭眰鐨勭粍鎴愰儴鍒嗘湁鏃跺欐槸鏈夌敤鐨勶紝浣嗘湰鏂囩殑鍓╀笅閮ㄥ垎灝嗕竴鐩翠嬌鐢ㄧ畝媧佺殑璇硶銆?/p> 鏈鍚庢潵鐪嬪寘瑁呯被琚嬌鐢ㄧ殑鎯呭喌: 鍥犱負鎴戜滑鐨刉orld綾誨彧鏄竴涓畝鍗曠殑struct錛屽畠鏈変竴涓殣寮忕殑鏃犲弬鏁?no-argument)(nullary)鏋勯犲櫒銆侭oost.Python榛樿鏆撮湶nullary鏋勯犲櫒錛岃繖灝辨槸鎴戜滑鍙互鍍忎笅闈㈣繖鏍峰啓鐨勫師鍥? 鐒惰屼笉綆″摢闂ㄨ璦錛岃璁″緱濂界殑綾誨彲鑳介兘闇瑕佹瀯閫犲櫒鍙傛暟錛屼互寤虹珛浠栦滑鐨勪笉鍙橀噺(invariants)銆傚湪Python閲岋紝__init__鍙槸涓涓壒孌婂悕縐扮殑鎴愬憳鍑芥暟(method)錛屼笌榪欎笉鍚岋紝C++閲岀殑鏋勯犲櫒涓嶈兘鍍忔櫘閫氭垚鍛樺嚱鏁伴偅鏍峰鐞嗐傜壒鍒槸鎴戜滑涓嶈兘鍙栧畠鐨勫湴鍧: &World::World榪欐牱浼氳鎶ラ敊銆傚簱鎻愪緵浜嗕竴涓笉鍚岀殑鎺ュ彛鏉ユ寚瀹氭瀯閫犲櫒銆傚亣璁炬湁: 鎴戜滑鍙互榪欐牱淇敼鍖呰浠g爜: 褰撶劧錛孋++綾誨彲鑳借繕鏈夊叾浠栫殑鏋勯犲櫒錛屾垜浠篃鍙互鏆撮湶浠栦滑錛屽彧闇瑕佸悜def()浼犻掓洿澶歩nit<鈥?gt;鐨勫疄渚? Boost.Python鍏佽琚寘瑁呯殑鍑芥暟錛屾垚鍛樺嚱鏁頒互鍙婃瀯閫犲櫒琚噸杞斤紝浠ユ槧灝凜++閲嶈澆銆?/p> C++涓殑浠諱綍鍙叕鍏辯殑璁塊棶鐨勬暟鎹垚鍛橀兘鑳借交鏄撶殑琚寘瑁呮垚鍙鎴栬呭彧鍐欏睘鎬?attributes): 騫剁洿鎺ュ湪Python閲屼嬌鐢? 榪欎笉浼氬鑷存坊鍔犲睘鎬у埌World瀹炰緥__dict__錛屼粠鑰屽湪鍖呰澶у瀷鏁版嵁緇撴瀯鏃惰妭鐪佸ぇ閲忕殑鍐呭瓨銆傚疄闄呬笂錛岄櫎闈炰粠Python鏄懼紡娣誨姞灞炴э紝鍚﹀垯瀹炰緥__dict__鏍規(guī)湰涓嶄細琚垱寤恒侾ython鐨勮繖縐嶈兘鍔涙潵婧愪簬鏂扮殑Python 2.2 綾誨瀷緋葷粺錛屽挨鍏舵槸descriptor鎺ュ彛鍜宲roperty綾誨瀷銆?/p> 鍦–++閲岋紝鍙叕鍏辯殑璁塊棶鐨勬暟鎹垚鍛樿璁や負鏄碂緋曡璁$殑琛ㄧ幇錛屽洜涓轟粬浠牬鍧忎簡灝佽(encapsulation)錛屾枃浣撳悜瀵?style guides)閫氬父鎸囩ず浠d箣浠?getter" 鍜?"setter"鍑芥暟銆傜劧鑰屽湪Python閲岋紝__getattr__錛宊_setattr__鍜屼粠2.2寮濮嬫湁鐨刾roperty鎰忓懗鐫灞炴ц繘鍏ュ彧鏄▼搴忓憳鎺у埗涓嬬殑灝佽寰楁洿濂界殑璇硶宸ュ叿銆傞氳繃璁㏄ython property瀵圭敤鎴風(fēng)洿鎺ュ彲鐢紝Boost.Python榪炴帴浜嗕簩鑰呯殑涓嶅悓鎯敤璇傚鏋渕sg鏄鏈夌殑錛屾垜浠粛鐒惰兘鎶婂畠鏆撮湶涓篜ython閲岀殑灞炴? 涓婇潰鐨勪緥瀛愭槧灝勪簡浜轟滑鐔熸?zhèn)夌殑Python 2.2+閲岀殑property鐢ㄦ硶: 鑳界粰鐢ㄦ埛瀹氫箟綾誨瀷瀹氫箟綆楁湳鎿嶄綔絎︿竴鐩存槸涓ら棬璇█鐨勬暟鍊艱綆楀彇寰楁垚鍔熶竴涓噸瑕佸洜绱犮傚儚 Numpy 榪欐牱鐨勮蔣浠跺寘鐨勬垚鍔熻瘉鏄庝簡鍦ㄦ墿灞曟ā鍧椾腑鏆撮湶鎿嶄綔絎﹁兘浜х敓宸ㄥぇ鑳介噺銆侭oost.Python緇欏寘瑁呮搷浣滅閲嶈澆鎻愪緵浜嗙畝媧佺殑鏈哄埗銆備笅闈㈡槸鍖呰Boost鐨勬湁鐞嗘暟搴? rational number library)鐨勪唬鐮佺殑鐗囨柇: 榪欑欖旀硶鏄氳繃綆鍗曠殑搴旂敤"琛ㄨ揪寮忔ā鏉?("expression templates") [VELD1995] 鏉ユ柦鍔犵殑錛?琛ㄨ揪寮忔ā鏉?鏄竴縐嶆渶鍒濅負浼樺寲楂樻ц兘鐭╅樀浠f暟琛ㄨ揪寮忚屽紑鍙戠殑鎶鏈傛湰璐ㄦ槸涓嶇珛鍗寵繘琛岃綆楋紝鑰岄噸杞芥搷浣滅鏉ユ瀯閫犳弿榪拌綆楃殑綾誨瀷銆傚湪鐭╅樀浠f暟閲岋紝褰撹冭檻鏁翠釜琛ㄨ揪寮忕殑緇撴瀯錛岃屼笉鏄?璐┆鐨?瀵規(guī)瘡姝ユ搷浣滄眰鍊兼椂錛岀粡甯稿彲浠ヨ幏寰楁垙鍓фх殑浼樺寲銆侭oost.Python鐢ㄥ悓鏍風(fēng)殑鎶鏈潵鏋勫緩鍩轟簬鍖呭惈 self 鐨勮〃杈懼紡鐨勯傚綋鐨凱ython 鎴愬憳鍑芥暟瀵硅薄(method object)銆?/p> 瑕佸湪Boost.Python閲屾弿榪癈++緇ф壙鍏崇郴錛屽彲浠ュ儚涓嬮潰榪欐牱鎶婂彲閫夌殑bases<鈥?gt;鍙傛暟娣誨姞鍒癱lass_<鈥?gt;妯℃澘鍙傛暟琛ㄩ噷: 榪欐牱鏈変袱涓晥鏋滐細 褰撶劧浠庤鍖呰鐨凜++綾誨疄渚嬭鐢熸柊鐨凱ython綾繪槸鍙兘鐨勩傝繖鏄洜涓築oost.Python浣跨敤浜唍ew-style class緋葷粺錛岃繖濂楃郴緇熷湪Python鍐呯疆綾誨瀷涓婂伐浣滆壇濂姐備絾鏈変竴涓噸瑕佺粏鑺備笉鍚岋細 Python鍐呯疆綾誨瀷涓鑸湪__new__鍑芥暟閲屽緩绔嬩笉鍙橀噺(invariants)錛屼粠鑰岃鐢熺被涓嶇敤鍦ㄨ皟鐢ㄥ畠鐨勬垚鍛樺嚱鏁板墠璋冪敤鍩虹被鐨刜_init__: 鍥犱負C++瀵硅薄鏋勯犳槸涓姝ユ搷浣?one-step operation)錛岀洿鍒板弬鏁板彲鐢–++瀹炰緥鏁版嵁鎵嶈兘琚瀯閫狅紝鍦╛_init__鍑芥暟閲? 鍙戠敓閿欒鐨勫師鍥犳槸Boost.Python 鍦ㄥ疄渚婦閲屾壘涓嶅埌綾誨瀷SomeBoostPythonClass鐨勫疄渚嬫暟鎹紱D鐨刜_init__鍑芥暟閬洊浜嗗熀綾葷殑鏋勯犲嚱鏁般傚彲浠ラ氳繃鍒犻櫎D鐨刜_init__鍑芥暟鎴栨槸璁╁畠鏄懼紡鐨勮皟鐢⊿omeBoostPythonClass.__init__(鈥?鏉ョ籂姝i敊璇?/p> 鍦≒ython閲屼粠鎵╁睍綾昏鐢熸柊鐨勭被鍨嬫病澶ぇ鎰忔濓紝闄ら潪瀹冧滑鍦–++閲岃兘琚鎬佺殑浣跨敤銆傛崲鍙ヨ瘽璇達紝褰撳湪C++閲岄氳繃鍩虹被鎸囬拡/寮曠敤璋冪敤Python鎴愬憳鍑芥暟鏃訛紝Python鎴愬憳鍑芥暟鐨勫疄鐜板簲璇ョ湅璧鋒潵鍍忔槸瑕嗙洊(override)浜咰++铏氬嚱鏁扮殑瀹炵幇銆傚洜涓鴻鏀瑰彉铏氬嚱鏁扮殑琛屼負鐨勫敮涓鏂規(guī)硶鏄湪琛嶇敓綾婚噷瑕嗙洊(override)瀹冿紝鐢ㄦ埛蹇呴』鏋勯犱竴涓壒孌婄殑琛嶇敓綾繪潵鍒嗘淳(dispatch)澶氭佺被鐨勮櫄鍑芥暟銆? 涓嬮潰鏄竴浜沺ython婕旂ず浠g爜: 瀵瑰垎媧捐呯被(Dispatcher class)錛岃娉ㄦ剰: 鏃犲彲鍚﹁錛岄噸澶嶈繖縐嶅叕寮忓寲鐨勬祦紼嬫槸鍐楅暱涔忓懗鐨勩傚挨鍏舵槸欏圭洰閲屾湁澶ч噺澶氭佺被鐨勬椂鍊欍傝繖鍙嶆槧浜咰++緙栬瘧鏃跺唴鐪佽兘鍔涚殑蹇呯劧闄愬埗:鏃犳硶鏋氫婦綾葷殑鎴愬憳鏉ュ垽鏂摢涓槸铏氬嚱鏁般備笉榪囷紝涓涓緢鏈夊笇鏈涚殑欏圭洰宸茬粡鍚姩錛岃嚧鍔涗簬鍐欎竴涓墠绔▼搴忔潵浠嶤++澶存枃浠惰嚜鍔ㄧ敓鎴愯繖浜涘垎媧捐呯被(浠ュ強鍏跺畠鍖呰浠g爜)銆?/p> Pyste 鏄敱Bruno da Silva de Oliveira寮鍙戠殑錛屽熀浜?GCC_XML 鏋勫緩銆侴CC_XML鍙互鐢熸垚XML鐗堟湰鐨凣CC鍐呴儴紼嬪簭鎻忚堪銆侴CC鏄竴縐嶉珮搴︾鍚?璇戞敞錛欳++鏍囧噯)鐨勭紪璇戝櫒錛屼粠鑰岀‘淇濅簡瀵規(guī)渶澶嶆潅鐨勬ā鏉夸唬鐮佺殑姝g‘澶勭悊鍜屽搴曞眰綾誨瀷緋葷粺鐨勫畬鍏ㄨ闂傚拰Boost.Python鐨勫摬瀛︿竴鑷達紝Pyste鎺ュ彛鎻忚堪鏃笉渚靛叆琚寘瑁呯殑浠g爜錛屼篃涓嶇敤鏌愮涓嶇啛鎮(zhèn)夌殑璇█鏉ヨ〃杈撅紝鐩稿弽錛氬畠鏄?00%鐨勭函Python鑴氭湰銆傚鏋淧yste鎴愬姛鐨勮瘽錛屽皢鏍囧織鐫鎴戜滑鐨勫緢澶氱敤鎴蜂笉鐢ㄥ啀浠涔堥兘鐩存帴鐢–++鍖呰銆傚畠?yōu)畣鍏佽鎴戜滑閫夋嫨鎶婁竴浜涘厓紼嬪簭(metaprogram)浠g爜浠嶤++縐誨姩鍒癙ython銆傛垜浠湡寰呬笉涔呭悗涓嶄粎鐢ㄦ埛錛孊oost.Python寮鍙戣呰嚜宸變篃鑳戒互娣峰悎鐨勬濊礬鏉ヨ冭檻("thinking hybrid")浠栦滑鑷繁鐨勪唬鐮併?/p> 搴忓垪鍖栨槸鎶婂唴瀛樹腑鐨勫璞¤漿鎹㈡垚鍙互淇濆瓨鍒扮鐩樹笂鎴栭氳繃緗戠粶浼犻佺殑鏍煎紡鐨勮繃紼嬨傚簭鍒楀寲鍚庣殑瀵硅薄(鏈甯歌鐨勬槸綆鍗曞瓧絎︿覆)鍙互琚噸鏂板彇寰楀茍杞崲鍥炲師鏉ョ殑瀵硅薄銆傚ソ鐨勫簭鍒楀寲緋葷粺鑳藉鑷姩杞崲鏁翠釜瀵硅薄灞傛(object hierarchies)銆侾ython鐨勬爣鍑唒ickle妯″潡姝f槸榪欐牱鐨勭郴緇熴傚畠鍒╃敤璇█寮哄ぇ鐨勮繍琛屾椂鍐呯渷鏉ュ簭鍒楀寲鍑犱箮鏄換鎰忕殑鐢ㄦ埛瀹氫箟瀵硅薄銆傚姞涓婁竴浜涚畝鍗曠殑闈炰鏡鍏ラ檺瀹氾紝榪欑寮哄ぇ鐨勮鏂藉彲浠ヨ鎵╁睍鎴愬琚寘瑁呯殑C++瀵硅薄涔熸湁鏁堛備笅闈㈡槸涓涓緥瀛? 鐜板湪璁╂垜浠垱寤轟竴涓猈orld瀵硅薄騫舵妸瀹冩斁鍒扮鐩樹笂: 鍦ㄥ彲鑳戒笉鍚岀殑璁$畻鏈虹殑鍙兘涓嶅悓鐨勬搷浣滅郴緇熺殑鍙兘涓嶅悓鐨勮剼鏈腑: 褰撶劧涔熷彲浠ョ敤cPickle鏉ヨ幏寰楁洿蹇殑澶勭悊閫熷害銆?/p> Boost.Python鐨刾ickle_suite瀹屽叏鏀寔鏍囧噯Python鏂囨。瀹氫箟鐨刾ickle鍗忚銆傜被浼糚ython閲岀殑__getinitargs__鍑芥暟錛宲ickle_suite鐨刧etinitargs()璐熻矗鍒涘緩鍙傛暟tuple鏉ラ噸寤鴻pickle浜嗙殑瀵硅薄銆侾ython pickle鍗忚涓殑鍏朵粬鍏冪礌錛宊_getstate__ 鍜宊_setstate__鍙互閫氳繃C++ getstate鍜宻etstate鍑芥暟鏉ュ彲閫夌殑鎻愪緵銆侰++鐨勯潤鎬佺被鍨嬬郴緇熷厑璁稿簱鍦ㄧ紪璇戞椂紜繚娌℃湁鎰忎箟鐨勫嚱鏁扮粍鍚?渚嬪錛氭病鏈塻etstate 灝眊etstate)涓嶄細琚嬌鐢ㄣ?/p> 瑕佹兂搴忓垪鍖栨洿澶嶆潅鐨凜++瀵硅薄闇瑕佸仛姣斾笂闈㈢殑渚嬪瓙紼嶅井澶氱偣鐨勫伐浣溿傚垢榪愮殑鏄疧bject鎺ュ彛(鍙傝涓嬩竴鑺?鍦ㄤ繚鎸佷唬鐮佷究浜庣鐞嗕笂甯簡澶у繖銆?/p> 鏃犳墍涓嶅湪鐨凱yObject*錛屾墜鍔ㄥ紩鐢ㄨ鏁幫紝闇瑕佽浣忔槸鍝釜API璋冪敤榪斿洖浜?鏂扮殑"(鑷韓鎷ユ湁鐨?寮曠敤鎴栨槸"鍊熸潵鐨?(鍘熷鐨?寮曠敤錛岃繖浜涘彲鑳芥湁緇忛獙鐨凜璇█鎵╁睍妯″潡鐨勪綔鑰呴兘鐔熸?zhèn)夈傝繖浜涚害鏉熶笉浠呴夯鐑︼紝鏇存槸閿欒鐨勪富瑕佹潵婧愶紝灝ゅ叾鏄瓨鍦ㄥ紓甯哥殑鏃跺欍?/p> Boost.Python鎻愪緵浜嗕竴涓猳bject綾伙紝瀹冭嚜鍔ㄥ寲浜嗗紩鐢ㄨ鏁板茍鎻愪緵浠繪剰綾誨瀷鐨凜++瀵硅薄鍒癙ython鐨勮漿鎹€傝繖鏋佸ぇ鐨勫噺杞諱簡鏈潵鐨勬墿灞曟ā鍧椾綔鑰呯殑瀛︿範璐熸媴銆?/p> 浠庝換涓綾誨瀷鍒涘緩object鏋佸害綆鍗? object鍙互鍜屾墍鏈夊叾瀹冪被鍨嬭繘琛屾ā鏉垮寲鐨勪氦浜掞紝鑷姩鐨勮繘琛屽埌Python鐨勮漿鎹€傝繖涓鍒囪嚜鐒跺緱寰堝鏄撹蹇界暐涓嶈: 涓婇潰鐨勪緥瀛愪腑錛屽湪绱㈠紩鍜屼箻娉曟搷浣滆璋冪敤鍓嶏紝4鍜?0琚漿鎹㈡垚浜哖ython瀵硅薄銆?/p> extract<T>綾繪ā鏉垮彲浠ョ敤鏉ユ妸Python瀵瑰璞¤漿鎹㈡垚C++綾誨瀷: 濡傛灉浠諱竴鏂瑰悜鐨勮漿鎹笉鑳芥墽琛岋紝灝嗗湪榪愯鏃舵姏鍑轟竴涓傚綋鐨勫紓甯搞?/p> 浼撮殢object綾誨瀷鐨勬槸涓濂楄鐢熺被鍨嬶紝灝藉彲鑳界殑鏄犲皠Python鐨勫唴緗被鍨?list錛宒ict錛宼uple絳?銆傝繖鏍峰氨鑳芥柟渚跨殑浠嶤++鎿嶄綔榪欎簺楂樼駭綾誨瀷浜? 榪欑湅璧鋒潵鍜屽伐浣滆搗鏉ュ嚑涔庡氨鍍忔槸閫氬父鐨刾ython浠g爜錛屼絾瀹冨疄闄呬笂鏄函鐨凜++銆傚綋鐒舵垜浠兘鍖呰鎺ュ彈鎴栬繑鍥瀘bject瀹炰緥鐨勫嚱鏁般?/p> 鍥犱負緇撳悎緙栫▼璇█鍏鋒湁瀹為檯鐨勫拰蹇冪悊鐨勫洶闅撅紝鍦ㄨ繘琛屼換浣曞疄闄呭紑鍙戝墠鍐沖畾浣跨敤鍗曚竴鐨勮璦鏄櫘閬嶇幇璞°傚寰堝搴旂敤鏉ヨ錛屾ц兘涓婄殑鑰冭檻鍐沖畾浜嗘牳蹇冪畻娉曡鐢ㄧ紪璇戣璦瀹炵幇銆備笉騫哥殑鏄紝鍥犱負闈欐佺被鍨嬬郴緇熺殑澶嶆潅鎬э紝鎴戜滑涓鴻繍琛屾椂鎬ц兘瑕佷粯鍑哄紑鍙戞椂闂村ぇ閲忓闀跨殑浠d環(huán)銆傜粡楠岃〃鏄庯紝鍜屽紑鍙戠浉搴旂殑Python浠g爜姣旇搗鏉ワ紝寮鍙戝彲緇存姢鐨凜++浠g爜閫氬父闇瑕佹洿闀跨殑鏃墮棿鍜岃壈闅懼緱澶氭墠鑳借幏寰楃殑宸ヤ綔緇忛獙銆傚嵆浣垮紑鍙戣呰寰楀彧鐢ㄤ竴闂ㄧ紪璇戣璦寮鍙戞尯濂斤紝涓轟簡鐢ㄦ埛錛屼粬浠篃緇忓父鐢ㄦ煇縐嶇被鍨嬬殑鐗瑰埆鐨勮剼鏈眰鏉ヨˉ鍏呯郴緇燂紝鍝曚粬浠案榪滀笉浼氬緱鍒板悓鏍風(fēng)殑濂藉銆?/p> Boost.Python璁╂垜浠兘 think hybrid 銆侾ython鍙互鐢ㄦ潵蹇熸惌寤烘柊鐨勫簲鐢ㄧ殑鍘熷瀷錛涘湪寮鍙戣兘宸ヤ綔鐨勭郴緇熸椂錛屽畠鐨勬槗鐢ㄦу拰澶ч噺鐨勬爣鍑嗗簱浣挎垜浠浜庨鍏堛傞渶瑕佺殑璇濓紝鍙互鐢ㄨ兘宸ヤ綔鐨勪唬鐮佹潵鎵懼嚭闄愬埗閫熷害鐨勭儹鐐?rate-limiting hotspots)銆備負浜嗘渶澶у寲鎬ц兘錛岃繖浜涚儹鐐瑰彲浠ョ敤C++鏉ラ噸鏂板疄鐜幫紝鐒跺悗鐢˙oost.Python緇戝畾鏉ヨ繛榪涘凡鏈夌殑楂樼駭榪囩▼(璇戞敞錛氭寚Python紼嬪簭)銆?/p> 褰撶劧錛屽鏋滀竴寮濮嬪氨娓呮寰堝綆楁硶鏈鍚庝笉寰椾笉鐢–++鏉ュ疄鐜幫紝榪欑 鐢遍《鑷充笅(top-down) 鐨勬柟娉曞氨娌¢偅涔堝惛寮曚漢浜嗐傚垢榪愮殑鏄紝Boost.Python涔熷厑璁告垜浠嬌鐢?鐢卞簳鑷充笂(bottom-up) 鐨勬柟娉曘傛垜浠潪甯告垚鍔熺殑鎶婅繖縐嶆柟娉曠敤鍦ㄤ簡涓涓敤浜庣瀛﹀簲鐢ㄧ殑宸ュ叿綆辮蔣浠剁殑寮鍙戜笂銆傝繖涓伐鍏風(fēng)寮濮嬩富瑕佹槸涓涓甫Boost.Python緇戝畾鐨凜++綾誨簱錛屾帴涓嬫潵鏈変竴灝忔鏃墮棿澧為暱涓昏闆嗕腑鍦–++閮ㄥ垎錛岄殢鐫宸ュ叿綆卞彉寰楄秺鏉ヨ秺瀹屾暣錛岃秺鏉ヨ秺澶氭柊娣誨姞鐨勫姛鑳藉彲浠ョ敤Python鏉ュ疄鐜般?/p> 涓婂浘鏄疄鐜版柊鐨勭畻娉曟椂鏂版坊鍔犵殑C++浠g爜鍜孭ython浠g爜鐨勪及璁℃瘮鐜囬殢鏃墮棿鍙樺寲鐨勬儏鍐點傛垜浠璁¤繖涓瘮鐜囦細杈懼埌鎺ヨ繎70% (Python)銆傝兘澶熶富瑕佺敤Python鑰屼笉鏄洿鍥伴毦鐨勯潤鎬佺被鍨嬭璦鏉ヨВ鍐蟲柊闂錛岃繖鏄垜浠湪Boost.Python涓婄殑鎶曞叆鐨勫洖鎶ャ傛垜浠殑鎵鏈変唬鐮侀兘鑳戒粠Python璁塊棶錛岃繖浣垮緱鏇村箍娉涚殑寮鍙戣呭彲浠ョ敤瀹冩潵蹇熷紑鍙戞柊鐨勫簲鐢ㄣ?/p> Boost.Python鐨勭涓鐗堟槸鐢盌ave Abrahams鍦―ragon Systems寮鍙戠殑銆傚湪閭i噷浠栭潪甯歌崳騫哥殑璇峰埌Tim Peters浣滀負浠栫殑"Python涔嬬"( "The Zen of Python")瀵煎笀銆侱ave鐨勫伐浣滀箣涓鏄紑鍙戝熀浜嶱ython鐨勮嚜鐒惰璦澶勭悊緋葷粺銆傚洜涓烘渶緇堣琚敤浜庡祵鍏ュ紡紜歡錛岀郴緇熻綆楀瘑闆嗙殑鍐呮牳鎬繪槸琚亣璁炬垚瑕佺敤C++鏉ラ噸鍐欎互浼樺寲閫熷害鍜屽唴瀛橀渶姹傞噺(memory footprint) [1] 銆傝繖涓」鐩篃鎯崇敤Python嫻嬭瘯鑴氭湰 [2] 鏉ユ祴璇曟墍鏈夌殑C++浠g爜銆傚綋鏃舵垜浠煡閬撶殑緇戝畾C++鍜孭ython鐨勫敮涓宸ュ叿鏄?SWIG 錛屼絾閭f椂瀹冨鐞咰++鐨勮兘鍔涙瘮杈冨急銆傝璇村湪閭f椂灝卞Boost.Python鎵浣跨敤鏂規(guī)硶鐨勫彲鑳戒紭瓚婁箣澶勬湁浜嗕粈涔堟繁鍒繪礊瑙侊紝閭f槸楠椾漢鐨勩侱ave瀵硅姳淇忕殑C++妯℃澘鎶宸х殑鍏磋叮鍜屽ù鐔熷垰濂藉埌浜嗚兘鐪熸鍋氱偣浠涔堢殑鏃跺欙紝Boost.Python灝遍偅鏍峰嚭鐜頒簡錛屽洜涓哄畠婊¤凍浜嗛渶姹傦紝鍥犱負瀹冪湅璧鋒潵鎸洪叿錛屽煎緱涓璇曘?/p> 鏃╂湡鐨勭増鏈拡瀵圭殑璁稿鍩烘湰鐩爣鍜屽湪榪欑瘒璁烘枃涓弿榪扮殑鐩稿悓銆傛渶鏄捐憲鐨勫尯鍒湪浜庢棭鏈熺増鏈殑璇硶瑕佺◢寰夯鐑︿竴鐐癸紝緙轟箯瀵規(guī)搷浣滅閲嶈澆錛宲ickling錛屽熀浜庣粍浠剁殑寮鍙戠殑涓撻棬鏀寔銆傚悗闈笁涓壒鎬у緢蹇氨琚玌llrich Koethe鍜孯alf Grosse-Kunstleve [3] 鍔犱笂浜嗐傚叾浠栫儹蹇冪殑璐$尞鑰?contributors)涔熷嚭鏉ヨ礎(chǔ)鐚簡涓浜涙敼榪涳紝濡傚宓屽妯″潡鍜屾垚鍛樺嚱鏁扮殑鏀寔絳夈?/p> 鍒?001騫存棭鏈熸椂寮鍙戝凡緇忕ǔ瀹氫笅鏉ヤ簡錛屽緢灝戞湁鏂扮殑鐗規(guī)ф坊鍔狅紝鐒惰岃繖鏃朵竴涓儲浜虹殑闂鏆撮湶鍑烘潵浜嗭細Ralf宸茬粡寮濮嬪湪涓涓嬌鐢?EDG 鍓嶇鐨勭紪璇戝櫒鐨勯鍙戝竷鐗堜笂嫻嬭瘯Boost.Python錛岃繖鏃禕oost.Python鍐呮牳涓礋璐e鐞哖ython鍜孋++鐨勭被鍨嬭漿鎹㈢殑鏈哄埗(mechanism)緙栬瘧澶辮觸浜嗐傜粨鏋滆瘉鏄庢垜浠竴鐩村湪鍒╃敤涓涓猙ug錛岃繖涓猙ug鍦ㄦ墍鏈夋垜浠祴璇曡繃鐨凜++緙栬瘧鍣ㄥ疄鐜頒腑閮介潪甯告櫘閬嶃傛垜浠煡閬撻殢鐫C++緙栬瘧鍣ㄥ緢蹇彉寰楁洿鍔犳爣鍑嗗吋瀹癸紝搴撳皢寮濮嬪湪鏇村鐨勫鉤鍙頒笂澶辮觸銆傚緢涓嶅垢錛屽洜涓鴻繖濂楁満鍒舵槸搴撶殑鍔熻兘鐨勪腑鏋紝瑙e喅闂鐪嬭搗鏉ラ潪甯稿洶闅俱?/p> 騫歌繍鐨勬槸閭d竴騫寸殑鍚庢湡錛孡awrence Berkeley鍜屽悗鏉ョ殑Lawrence Livermore National labs鍜?Boost Consulting 絳捐浜嗘敮鎸丅oost.Python鐨勫紑鍙戠殑鍚堝悓銆傝繖鏍峰氨鏈変簡鏂扮殑鏈轟細鏉ュ鐞嗗簱鐨勫熀鏈棶棰橈紝浠庤岀‘淇濆皢鏉ョ殑鍙戝睍銆傞噸鏂拌璁″紑濮嬩簬浣庣駭綾誨瀷杞崲鏋舵瀯錛屽唴緗殑鏍囧噯鍏煎鍜屽鍩轟簬緇勪歡鐨勫紑鍙戠殑鏀寔(鍜屼笉寰椾笉鏄懼紡鐨勮法瓚婃ā鍧楄竟鐣屽鍏ユ垨瀵煎嚭杞崲鐨勭涓鐗堝艦鎴愬姣?銆傚Python鍜孋++瀵硅薄鐨勫叧緋昏繘琛屼簡鍒嗘瀽錛屼粠鑰岃兘鏇寸洿瑙傜殑澶勭悊C++ lvalues鍜宺values銆?/p> Python 2.2閲屽嚭鐜扮殑寮哄ぇ鐨勬柊綾誨瀷緋葷粺浣垮緱閫夋嫨鏄惁緇存姢瀵筆ython 1.5.2鐨勫吋瀹規(guī)у彉寰楀鏄撲簡錛氳繖涓涪寮冨ぇ閲忕簿蹇冨埗浣滅殑浠呬粎鐢ㄦ潵妯℃嫙classic Python綾葷殑浠g爜鐨勬満浼氾紝濂界殑浠や漢鏃犳硶鎷掔粷銆傚彟澶栵紝Python iterators 鍜?descriptors鎻愪緵浜嗛噸瑕佷笖浼橀泤鐨勫伐鍏鋒潵鎻忚堪綾諱技鐨凜++緇撴瀯銆備竴鑸寲浜嗙殑瀵硅薄鎺ュ彛鐨勫紑鍙戝厑璁告垜浠繘涓姝ユ妸C++紼嬪簭鍛樺拰浣跨敤Python C API甯︽潵鐨勫嵄闄╂у拰璇硶璐熸媴闅旂寮銆傚ぇ閲忕殑鍏朵粬鐗規(guī)у湪榪欎釜闃舵琚姞浜嗚繘鏉ワ紝鍖呮嫭C++寮傚父緲昏瘧錛屾敼榪涚殑閲嶈澆鍑芥暟鏀寔錛岃繕鏈夋渶閲嶈鐨勭敤鏉ュ鐞嗘寚閽堝拰寮曠敤鐨凜allPolicies銆?/p> 浜?002騫村崄鏈堬紝絎簩鐗堢殑Boost.Python鍙戝竷浜嗐傞偅浠ュ悗鐨勫紑鍙戦泦涓湪鏀硅繘瀵笴++榪愯鏃跺鎬佸拰鏅鴻兘鎸囬拡鐨勬敮鎸佷笂銆傜壒鍒槸Peter Dimov鐨勫閥濡欑殑boost::shared_ptr璁捐浣挎垜浠兘緇欐販鍜岀郴緇熷紑鍙戣呮彁渚涗竴鑷寸殑鎺ュ彛錛岀敤浜庤法瓚婅璦钘╃鏉ュ洖縐誨姩瀵硅薄鑰屼笉涓㈠け淇℃伅銆?/p> 鍒氬紑濮嬶紝鎴戜滑鎷呭績Boost.Python v2鐨勫鏉傛т細闃葷璐$尞鑰咃紝浣?Pyste 鍜屽嚑涓叾浠栭噸瑕佺壒鎬х殑璐$尞(contribution)鐨勫嚭鐜頒嬌榪欎簺鎷呭績鏄懼緱澶氫綑浜嗐傛瘡澶╁嚭鐜板湪Python C++-sig涓婄殑闂鍜屽笇鏈涘緱鍒扮殑鏀硅繘鐨勭Н鍘?backlog)琛ㄦ槑浜嗗簱姝e湪琚嬌鐢ㄣ傚鎴戜滑鏉ヨ錛屾湭鏉ョ湅璧鋒潵寰堝厜鏄庛?/p> Boost.Python 瀹炵幇浜嗕袱縐嶅姛鑳戒赴瀵岀殑浼樼鐨勮璦鐜闂寸殑鏃犵紳鍗忎綔銆傚洜涓哄畠鍒╃敤妯℃澘鍏冪紪紼嬫妧鏈潵瀵圭被鍨嬪拰鍑芥暟榪涜鍐呯渷錛岀敤鎴鋒案榪滅敤涓嶇潃鍐嶅絎笁縐嶈璦:鎺ュ彛瀹氫箟鏄敤綆媧佽屽彲緇存姢鐨凜++鍐欑殑銆傚悓鏍鳳紝鍖呰緋葷粺涓嶇敤鍐嶈В鏋怌++澶存枃浠舵垨鏄弿榪扮被鍨嬬郴緇燂細緙栬瘧鍣ㄩ兘緇欐垜浠仛浜嗐?/p> 璁$畻瀵嗛泦鐨勪換鍔¢傚悎寮哄ぇ鐨凜++錛屽畠涓鑸笉鍙兘鐢ㄧ函Python鏉ュ疄鐜般傜劧鑰屽儚搴忓垪鍖栬繖鏍風(fēng)殑宸ヤ綔錛屽彲鑳界敤Python寰堢畝鍗曪紝鐢–++灝遍潪甯稿洶闅俱傚亣濡傛湁浠庡簳灞傚紑濮嬫瀯寤烘販鍚堢郴緇熺殑濂緢錛屾垜浠湁鏂扮殑淇″績鍜屽姩鍔涙潵榪涜璁捐銆?/p>鎽樿
綆浠?/a>
Boost.Python 璁捐鐩爣
Hello Boost.Python World
char const* greet(unsigned x)
{
static char const* const msgs[] = { "hello"錛?Boost.Python"錛?world!" };
if (x > 2)
throw std::range_error("greet: index out of range");
return msgs[x];
}
extern "C" // 鎵鏈塒ython浜や簰閮戒嬌鐢–閾炬帴鍜岃皟鐢ㄤ範鎯?
{
// 澶勭悊鍙傛暟/緇撴灉杞崲鍜屾鏌ョ殑鍖呰灞?
PyObject* greet_wrap(PyObject* args錛孭yObject * keywords)
{
int x;
if (PyArg_ParseTuple(args錛?i"錛?amp;x)) // 鍙栧嚭/媯鏌ュ弬鏁?
{
char const* result = greet(x); // 璋冪敤琚寘瑁呯殑鍑芥暟
return PyString_FromString(result); // 緇撴灉杞崲鎴怭ython
}
return 0; // 鍙戠敓浜嗛敊璇?
}
// 寰呭寘瑁呭嚱鏁拌〃錛屽嚱鏁扮敤榪欎釜妯″潡鏉ユ毚闇?
static PyMethodDef methods[] = {
{ "greet"錛実reet_wrap錛孧ETH_VARARGS錛?return one of 3 parts of a greeting" }
錛寋 NULL錛孨ULL錛?錛孨ULL } // sentinel
};
// 妯″潡鍒濆鍖栧嚱鏁?
DL_EXPORT init_hello()
{
(void) Py_InitModule("hello"錛宮ethods); // 娣誨姞鎴愬憳鍑芥暟(method)鍒版ā鍧?
}
}
#include <boost/python.hpp>
using namespace boost::python;
BOOST_PYTHON_MODULE(hello)
{
def("greet"錛実reet錛?return one of 3 parts of a greeting");
}
>>> import hello
>>> for x in range(3):
... print hello.greet(x)
...
hello
Boost.Python
world!
搴撴瑙?/a>
鏆撮湶綾?Exposing Classes)
struct World
{
void set(std::string msg) { this->msg = msg; }
std::string greet() { return msg; }
std::string msg;
};
#include <boost/python.hpp>
BOOST_PYTHON_MODULE(hello)
{
class_<World>("World")
.def("greet"錛?amp;World::greet)
.def("set"錛?amp;World::set)
;
}
class_<World>("World")
class_<World> w("World");
w.def("greet"錛?amp;World::greet)
class_<World> w("World");
w.def("greet"錛?amp;World::greet);
w.def("set"錛?amp;World::set);
>>> import hello
>>> planet = hello.World()
>>> planet.set('howdy')
>>> planet.greet()
'howdy'
鏋勯犲櫒(Constructors)
>>> planet = hello.World()
struct World
{
World(std::string msg); // 娣誨姞鐨勬瀯閫犲櫒
...
class_<World>("World"錛宨nit<std::string>())
.def(init<double錛宒ouble>())
...
class <World>("World"錛宨nit<std::string>())
.def(init<double錛宒ouble>())
...
鏁版嵁鎴愬憳鍜屽睘鎬?Properties)
class_<World>("World"錛宨nit<std::string>())
.def_readonly("msg"錛?amp;World::msg)
...
>>> planet = hello.World('howdy')
>>> planet.msg
'howdy'
class_<World>("World"錛宨nit<std::string>())
.add_property("msg"錛?amp;World::greet錛?amp;World::set)
...
>>> class World(object):
... __init__(self錛宮sg):
... self.__msg = msg
... def greet(self):
... return self.__msg
... def set(self錛宮sg):
... self.__msg = msg
... msg = property(greet錛宻et)
鎿嶄綔絎﹂噸杞?/a>
class_<rational<int> >("rational_int")
.def(init<int錛宨nt>()) // constructor錛宔.g. rational_int(3錛?)
.def("numerator"錛?amp;rational<int>::numerator)
.def("denominator"錛?amp;rational<int>::denominator)
.def(-self) // __neg__ (unary minus)
.def(self + self) // __add__ (homogeneous)
.def(self * self) // __mul__
.def(self + int()) // __add__ (heterogenous)
.def(int() + self) // __radd__
緇ф壙
class_<Derived錛宐ases<Base1錛孊ase2> >("Derived")
...
>>> class L(list):
... def __init__(self):
... pass
...
>>> L().reverse()
>>>
>>> class D(SomeBoostPythonClass):
... def __init__(self):
... pass
...
>>> D().some_boost_python_method()
Traceback (most recent call last):
File "<stdin>"錛宭ine 1錛宨n ?
TypeError: bad argument type for built-in operation
铏氬嚱鏁?/a>
//
// 瑕佸寘瑁呯殑鎺ュ彛:
//
class Base
{
public:
virtual int f(std::string x) { return 42; }
virtual ~Base();
};
int calls_f(Base const& b錛宻td::string x) { return b.f(x); }
//
// 鍖呰浠g爜
//
// 鍒嗘淳鑰呯被(Dispatcher class)
struct BaseWrap : Base
{
// 鍌ㄥ瓨鎸囧悜Python瀵硅薄鐨勬寚閽?
BaseWrap(PyObject* self_) : self(self_) {}
PyObject* self;
// 褰揻娌℃湁琚鐩?override)鏃剁殑緙虹渷瀹炵幇
int f_default(std::string x) { return this->Base::f(x); }
// 鍒嗘淳瀹炵幇
int f(std::string x) { return call_method<int>(self錛?f"錛寈); }
};
...
def("calls_f"錛宑alls_f);
class_<Base錛孊aseWrap>("Base")
.def("f"錛?amp;Base::f錛?amp;BaseWrap::f_default)
;
>>> class Derived(Base):
... def f(self錛宻):
... return len(s)
...
>>> calls_f(Base()錛?foo')
42
>>> calls_f(Derived()錛?forty-two')
9
鏇存繁灞傛鐨勫弽灝勫嵆灝嗗嚭鐜?Deeper Reflection on the Horizon)?
搴忓垪鍖?Serialization)
#include <string>
struct World
{
World(std::string a_msg) : msg(a_msg) {}
std::string greet() const { return msg; }
std::string msg;
};
#include <boost/python.hpp>
using namespace boost::python;
struct World_picklers : pickle_suite
{
static tuple
getinitargs(World const& w) { return make_tuple(w.greet()); }
};
BOOST_PYTHON_MODULE(hello)
{
class_<World>("World"錛宨nit<std::string>())
.def("greet"錛?amp;World::greet)
.def_pickle(World_picklers())
;
}
>>> import hello
>>> import pickle
>>> a_world = hello.World("howdy")
>>> pickle.dump(a_world錛宱pen("my_world"錛?w"))
>>> import pickle
>>> resurrected_world = pickle.load(open("my_world"錛?r"))
>>> resurrected_world.greet()
'howdy'
瀵硅薄鎺ュ彛(Object interface)
object s("hello錛寃orld"); // s 綆$悊涓涓狿ython瀛楃涓?
object ten_Os = 10 * s[4]; // -> "oooooooooo"
double x = extract<double>(o);
dict d;
d["some"] = "thing";
d["lucky_number"] = 13;
list l = d.keys();
浠庢販鍚堢殑鎬濊礬鎬濊?Thinking hybrid)
寮鍙戝巻鍙?/a>
緇撹
]]>
聽聽聽
聽聽聽鎴戜篃涓嬭繃BOA錛屼絾鎰熻鐜板湪瀹冭繕鏈変笉灝戠己闄鳳紝姣曠珶鎵嶆槸alpha鐗堛備及璁$瓑鍒?.0鍑烘潵灝卞緢媯掍簡銆?br />聽聽聽WingIDE 涓嶇煡閬撴庝箞鏍鳳紝涓嬫灝濊瘯鍚с?/font>
]]>